码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-08-23 16:52:21      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   os   io   数据   ar   2014   问题   

代码部分

#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;
}

运行结果

bubuko.com,布布扣

分析和讨论

众所周知:C++实现多态机制的核心在与对类的vtbl和类对象的vptr的维护。此处对此不做讨论,本文的主要目的是为了讨论在类中没有自己写初始化构造函数,但何时需要合成初始化构造函数,以及是否一定需要合成初始化构造函数。
对于第二种情况的讨论时重点:在用子类对父类进行初始化的时候,我们假设编译器没有进行特殊处理的话,直接进行memberwise copy的话,那么父类ZoolAnimal的对象中的vptr会被子类Bear的vptr所覆盖,指向Bear class 的virtual function table,所以为了使初始化操作能够正常运行,就需要在初始化过程中,重新调整ZoolAnimal对象的vptr使其指向ZoolAnimal的vritual function table,这时就需要合成初始化构造函数进行调整。

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

标签:style   blog   http   os   io   数据   ar   2014   问题   

原文地址:http://blog.csdn.net/licong_carp/article/details/38778907

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!