class Base
{
public:
Base() {fun(); }
~Base() {fun(); }
virtual void fun() { cout << "Base::fun()" << endl; }
};
class Derive :public Base
{
public:
Derive() { fun(); }
~Derive() { fun(); }
virtual void fun() override { cout << "Derive::fun()" << endl; }
};
int main()
{
Derive de;
/* 输出
Base::fun()
Derive::fun() // 销毁Deriver部分
Derive::fun() // 销毁Base部分
Base::fun()
*/
return 0;
}
解释:
创建对象是时
在创建Derive对象时,需要先创建父类部分。执行到创建子对象时,先调用父类的构造函数。
Derive::Derive() // 这里先调用 Base::Base()
//{
// fun();
//}
在Base::Base()中,必先是创建虚表及虚表指针的初始化,否则在构造函数内就无法调用自身的虚函数。
Base::Base() // 先创建虚表,及虚表指针的指向
{
fun(); // 随后调用虚函数fun
}
当父对象创建完毕后,开始进行Derive对象的构造函数执行。
Derive::Derive() // 先创建虚表,及虚表指针的指向,注意这里要合并虚表
{
fun(); // 随后再调用虚函数fun()
}
销毁对象时
销毁对象按照“后申请,先销毁”原则,应当先销毁子类对象,再销毁父类对象。
先析构子对象Derive对象,虚表指针重置,使之指向自身所属类的虚表。
随后析构父对象Base对象,虚表指针重置,使之指向自身Base的虚表。
因此,在析构时,各自的析构函数都输出了各自的虚方法。