虚指针(vptr)
多态实现的条件:有继承、有virtual重写、有父类指针(引用)指向子类对象。
对象中的虚指针什么时候被初始化
- 对象在创建的时候,由编译器对vptr指针进行初始化
- 只有当对象的构造完全结束后vptr的指向才最终确定
- 父类对象的vptr指向父类虚函数表
- 子类对象的vptr指向子类虚函数表
构造函数不能为虚函数
执行虚函数时,会调用虚指针指向虚函数表中的虚函数,而虚指针是在对象创建时初始化的,而且当对象构造完全结束后vptr才确定所以此时无法虚指针,因为对象未创建
在构造函数中调用虚函数不能实现多态
因为调用父类构造函数时虚指针指向的是父类的虚函数表
一般情况下基类析构函数需要定义为虚函数
因为当基类指针指向派生类对象时,delete时若没有定义虚析构函数会调用父类的析构函数,无法销毁派生部分,当定义了虚函数的时候会调用用虚指针指向虚函数表中的虚函数,会调用派生类析构函数
文章来源: https://blog.csdn.net/weixin_43425693/article/details/89948378