(1)首先调用父类构造函数;
(2)调用成员对象的构造函数;
(3)子类自己的构造函数。
析构顺序与上面严格相反!
因此,因为是先调用父类构造函数,在父类的构造函数中,其虚函数表并未完全形成,要想在父类构造函数中使用多态功能是错误的!
譬如下代码:想在父类构造函数中实现多态,结果输出的却是父类的virfun。
其原因,可以从this的变化过程中看出,如下图所示class father
{
public:
father()
{
cout<<"father::father()n";
virfun();
}
virtual virfun()
{
cout << "father virtual fun()n";
}
};
class son : public father
{
public:
son()
{
cout<<"son::son()n";
}
virtual virfun()
{
cout << "son virtual fun()n";
}
};
int main()
{
son* p = new son();
return 0;
}
而采用下述代码,则能正确地实现多态
class father
{
public:
virtual virfun()
{
cout << "father virtual fun()n";
}
testfun()
{
virfun();
}
};
class son : public father
{
public:
virtual virfun()
{
cout << "son virtual fun()n";
}
};
int main()
{
father* p = new son();
p->testfun();
return 0;
}