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

代码部分

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

时间: 2024-10-10 15:15:56

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

编译器生成默认构造函数的情况

在类没有显示声明构造函数的情况下,编译器并不总是为我们自动生成默认构造函数,以下4种情况,编译器才会为我们自动生成默认构造函数: 1.类中有一个类成员含有默认构造函数的,编译器会为该类自动生成默认构造函数,自动插入代码,调用该成员的构造函数: 2.基类中含有默认构造函数,编译器会为该类自动生成默认构造函数,自动插入代码,调用基类的构造函数: 3.类中含有虚函数时,由于编译器要为该类生成虚函数表vtable,并为该类的对象生成指向该vtable的vptr,所以需要为该类合成默认构造函数: 4.虚继

利用GCC编译器生成动态链接库和静态链接库

转载请标明:http://www.cnblogs.com/winifred-tang94/ 1.编译过程 gcc –fPIC –c xxx.c 其中-fPIC是通知gcc编译器产生位置独立的目标代码.链接的时候不通过拷贝来进行. 2.链接过程 gcc –shared –o libxxx.so xxx.o 经过编译链接就可以生成动态链接库,其扩展名为.so Eg. 还可以gcc –fPIC –shared -o libhello.so hello.c 举个例子: //Hello.h //hello

无法打开编译器生成的文件:“../../build/vs71/release/v100/MD_MBCS\json_value.

1>正在生成代码 1>e:\Source\VC\?\json\jsoncpp-src-0.6.0-rc2\src\lib_json\json_value.cpp : fatal error C1083: 无法打开编译器生成的文件:“../../build/vs71/release/lib_json\json_value.asm”: No such file or directory 1>LINK : fatal error LNK1257: 代码生成失败 1>生成日志保存在“fil

如何用dumpbin.exe检查编译器生成的托管模块所嵌入的信息

开启CMD 运行到dumpbin目录下:D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin 运行命令VCVARS32.BAT,配置环境 如果不运行vcvars32.bat,会出现如下提示: 运行dumpbin命令 ? ? D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin>dumpbin /exports E: DSTCode\Web\DSTWeb\bin\DSTW

条款6:显式拒绝编译器生成的默认函数

如果一个对象是独一无二的,那么我们就不应该提供copy构造函数和copy assignment操作符函数(二者统称为copying函数).但是即使我们不定义它们,编译器也会在别人调用它们时默认提供,如何拒绝编译器的这种行为呢? 由于编译器自动生成的函数都是public的,因此你可以提供private的copying函数,而不实现它们,这样做有如下3点好处: 1>  防止编译器自动生成这些函数. 2>  声明为private可以阻止外部人员调用它们. 3>  只声明不实现可以防止membe

结构体的初始化(构造函数)

struct作为数据结构的实现体,它默认所有结构成员默认都是Public,而类的变量和常量数则默认为Private,不过其他类成员默认都是Public. C++结构体的继承默认是public,而c++类的继承默认是private. 所以结构体中使用构造函数也是合理的. 1 typedef struct Test{ 2 int id; 3 string name; 4 // 用以不初始化就构造结构体 5 Test(){} ; 6 //只初始化id 7 Test(string _name) { 8

Linux QtCreator设置mingw编译器生成windows程序

Qt跨平台,那必须在Linux平台编译一个可以在windows下运行的Qt程序才行,当然还得和QtCreator环境弄在一起才行. 工作环境:Centos 7 yum install qt5-qt* ming32-qt5-qt* ming64-qt5-qt* # 安装所有Qt的包 yum install qt-creator # 安装qtcreator 以mingw64为例 打开QtCreator,options=> Build & Run => Qt Versions => A

Qt ------ 初始化构造函数参数,parent

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } 1.QMainWindow 是 MainWindow 的父类 2.QWidget *parent 中的 parent 值赋值给 QMainWindow(parent) 中的 parent 3.写这句 QMainWindow(parent) 的原因是 new 一个 MainWindo

怎样在拿不到构造函数的情况下生成该构造函数的实例对象

需要使用Object.create()方法. function Person(name){ this.name = name; } var lilei = new Person("Lilei"); lilei.name; // "Lilei" var hanmeimei = Object.create(lilei); hanmeimei.name; // "Lilei"; lilei.name = "李雷"; hanmeime