代码部分
#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