首页 > 代码库 > 有关初始化构造函数何时由编译器生成的讨论?

有关初始化构造函数何时由编译器生成的讨论?

代码部分

#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,这时就需要合成初始化构造函数进行调整。

有关初始化构造函数何时由编译器生成的讨论?