C++ 使用基对象和派生对象的虚拟函数

C++ 使用基对象和派生对象的虚拟函数,c++,virtual,object-slicing,C++,Virtual,Object Slicing,我已经阅读了关于vtable的内容,并且理解了指向基类和派生类对象的基类指针的概念。 有人能解释一下,当基类和派生类都是对象并且派生类对象被分配给基类对象时,vtable是如何创建的吗。下面的例子中的案例3 #include <iostream> #include <exception> using namespace std; class Base { public: virtual void function1() { cout<<"Base

我已经阅读了关于vtable的内容,并且理解了指向基类和派生类对象的基类指针的概念。 有人能解释一下,当基类和派生类都是对象并且派生类对象被分配给基类对象时,vtable是如何创建的吗。下面的例子中的案例3

#include <iostream>
#include <exception>
using namespace std;


class Base
{
public:
    virtual void function1() { cout<<"Base - func1"<<endl; }
    virtual void function2() { cout<<"Base - func2"<<endl; }
};

class Derived1: public Base
{
public:
    virtual void function1() { cout<<"Derived1 - func1"<<endl; }
};

class Derived2: public Base
{
public:
    virtual void function2() { cout<<"Derived2 - func2"<<endl; }
};

int main () 
{
    // Case 1
    Base* B1 = new Derived1();
    B1->function1();
    B1->function2();

    // Case 2
    cout<<endl;
    Base* B2 = new Derived2();
    B2->function1();
    B2->function2(); 

    // Case 3
    cout<<endl;
    Base B3;
    Derived1 D1;
    B3=D1;
    B3.function1();
    B3.function2(); 
}

B3=派生是对象切片的一个示例。。。仅将基类数据成员分配给,并且vtable指针继续指向基类函数

您应该避免切片-这可能很危险(请参阅以获取解释)。现在你知道了这个术语,你会很容易找到大量关于对象切片的阅读资料

Base B3;
D1 Derived;
B3=Derived;  //There is called default assignment operator
定义如下:

Base& operator=(const Base &objectToCopy) {...}

运算符接受类型为
Base
的参数,因此类型为
D1
的对象被视为类型为
Base
的对象。这意味着赋值运算符只能看到类
Base
中的
派生的
字段。
但是,指向
vtable
(从技术上讲是一个隐藏字段)的指针仍然没有被复制,因为它总是在构造函数中创建,并且与真实对象类型永久关联。

您对
B3
进行了切片。只需指出,命名类D1、D2,然后命名变量B1、B2、B3可能会令人困惑。至少对变量名使用小写,以表明它们不是类名。在代码中使用某些约定可以帮助您和任何阅读它的人。除非您讨论的是专门使用vtables技术来实现虚拟函数的实现,否则不应使用“vtable”一词。C++语言本身没有VTABLE的概念。操作符采用类型<代码> const Basic和< /C> >的参数,它不含蓄地将任何内容转换为<代码> BASE<代码>。转换发生在赋值过程中,而不是在调用运算符的过程中。它仍然与参数类型无关(您仍然错误地陈述了参数类型)。这与操作符方法内部发生的事情有关。我不明白,你是什么意思,或者你现在对我抱怨。我想我的答案很清楚。
Base& operator=(const Base &objectToCopy) {...}