class Base
{
public:
virtual ~Base()
{
}
virtual void func()
{
cout << "Base func()\n";
}
};
class BasePlus : public Base
{
public:
virtual ~BasePlus()
{
}
virtual void func()
{
cout << "BasePlus func()\n";
}
};
int main()
{
BasePlus bp;
Base b = bp;
b.func(); // Base func()
return 0;
}
一个类存在虚函数,那么对象创建的时候就会多一个虚函数指针 vptr,指向虚函数表。
上述代码,派生类对象直接赋值给基类对象,那么 BasePlus.vptr 不是也赋值给了 Base.vptr 了么,为什么调用 b.func()
却没有输出 BasePlus func()
呢?
当时在学多态的时候,一直没仔细思考过这个问题。现在想想,我的猜测如下:
应该是 vptr 压根没赋值过去。
Base b = bp
执行的是 Base 的默认 = 运算符操作,进行的是 memberwise copy。
还请各位大兄弟指点迷津。
Base b = bp;
执行的不是Base
的 operator= ,而是拷贝构造函数。构造的结果一定是一个Base
,而不是BasePlus
。默认的 operator= 的逻辑是对每一个子对象调用
operator=
。默认的 oprator= 的参数是const Base &
。vptr 是实现细节,不属于子对象。赋值之后,被赋值的对象依然是Base
的对象,不会变成BasePlus
的对象,对 vptr 的操作(如果有)必须保证这一点。