有关初始化构造函数何时由编译器生成的讨论?
2014-08-23 16:03
183 查看
代码部分
#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,这时就需要合成初始化构造函数进行调整。
相关文章推荐
- 第二章 构造函数语意学 编译器何时生成默认构造函数?
- C++中拒绝编译器自动生成copy构造函数和copy赋值运算符操作(6)---《Effective C++》
- 构造函数是怎样初始化字段的--减少所生成代码的大小
- 关于何时使用构造函数,何时使用初始化函数
- C#l编译器是否会为值类型生成默认的构造函数!
- C++成员变量的初始化顺序如果不使用初始化列表初始化,在构造函数内初始化时,此时与成员变量在构造函数中的位置有关。
- 何时使用构造函数初始化列表?
- C++ - 对象模型之 编译器何时才会自行添加构造函数
- 第二章 构造函数语意学 编译器何时合成拷贝构造函数?
- C++学习之构造函数的理解--模板形式的构造函数不会遮掩编译器生成的默认构造函数
- 何时构造函数必须使用初始化列表而不是赋值
- C++自动生成的构造函数为空且不执行初始化操作
- C++异常处理机制__3.编译器何时生成栈回退代码
- 何时构造函数必须使用初始化列表而不是赋值
- 编译器不会自动生成调用基类复制构造函数的代码
- C#的静态构造函数(主要说的是编译器为Lambda表达式生成的类)
- 使用初始化成员列表初始化数据与在构造函数中初始化数据
- [转载]LCC编译器的源程序分析(55)最终代码的生成
- 编译器初始化全局变量,并分配虚拟内存
- 又一波 有关 java 静态代码块 代码块 构造函数执行顺序问题