1 一般情况下,不允许在构造函数或者析构函数中调用虚函数。其实语法上都没有问题,只是会失去多态性。
如果在构造函数中调用虚函数,会先调用父类中的实现,也就失去了多态的性质。如果在析构函数中调用虚函数,也是同样的失去了多态性。
执行结果如下:
这段代码可以看出构造和析构函数中都调用了自己的函数,虚函数表没有生效。
2 虚函数表属于类,不属于某一个对象,如下所示,ptr和ptr2的虚函数表指向同一个地址
classvirtualtabe这个函数中三个变量,ptr和ptr2的虚函数表地址一致。 3 构造函数调用完毕后开始构建虚函数表。 先构造基类的虚函数表(基类的构造函数结束后) 再构造派生类的虚函数表(派生类的构造函数结束后) 析构的顺序与之相反,派生类析构函数运行完之后虚函数表指向基类的虚函数表, 基类的虚函数表运行完之后虚函数表彻底释放。 还是上一段代码,
基类A的构造函数开始运行前(没有进入构造函数)
基类A的构造函数开始运行后(进入构造函数),也就是进入函数前已经把改类的虚函数表构建完成
此时虚函数表的函数都指向基类的地址
派生类B的构造函数开始运行后,虚函数表指向了派生类虚函数地址
以下是析构流程:
派生类B的析构函数运行时
基类A的析构函数开始运行前
基类A的析构函数开始运行时,也就是说基类析构函数运行前派生类析构函数开始运行前,虚函数表发生改变
基类A析构函数运行后,虚函数表再次变化。
也就是说本类的析构函数运行完后虚函数表指向其父类。