首页 > 代码库 > 有关初始化构造函数何时由编译器生成的讨论?
有关初始化构造函数何时由编译器生成的讨论?
代码部分
#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,这时就需要合成初始化构造函数进行调整。
有关初始化构造函数何时由编译器生成的讨论?
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。