代码部分
#include "iostream"
using namespace std;
//讨论初始化构造函数
//主要讨论在有虚函数情况下的初始化构造函数问题
//含有虚函数的类对象维护一个vptr指向类中的vtbl
class ZoolAnimal
{
public:
ZoolAnimal(){}
~ZoolAnimal(){}
virtual void animates(){
cout << "ZoolAnimal::animates()" << endl;
}
virtual void draw(){
cout << "ZoolAnimal::draw()" << endl;
}
private:
};
class Bear : public ZoolAnimal{
public:
Bear(){}
~Bear(){}
virtual void animates(){
cout << "Bear::animates()" << endl;
}
virtual void draw(){
cout << "Bear::draw()" << endl;
}
virtual void dance(){
cout << "Bear::dance()" << endl;
}
private:
};
int main()
{
/*bear类型的数据初始化bear数据*/
Bear yogi;
Bear carp = yogi;
carp.animates();
carp.dance();
carp.draw();
/*bear数据初始化ZoolAnimal类型*/
ZoolAnimal zAnimal = carp;
zAnimal.animates();
zAnimal.draw();
return 0;
}
运行结果
分析和讨论
众所周知:C++实现多态机制的核心在与对类的vtbl和类对象的vptr的维护。此处对此不做讨论,本文的主要目的是为了讨论在类中没有自己写初始化构造函数,但何时需要合成初始化构造函数,以及是否一定需要合成初始化构造函数。
对于第二种情况的讨论时重点:在用子类对父类进行初始化的时候,我们假设编译器没有进行特殊处理的话,直接进行memberwise copy的话,那么父类ZoolAnimal的对象中的vptr会被子类Bear的vptr所覆盖,指向Bear class 的virtual function table,所以为了使初始化操作能够正常运行,就需要在初始化过程中,重新调整ZoolAnimal对象的vptr使其指向ZoolAnimal的vritual
function table,这时就需要合成初始化构造函数进行调整。