第五章:构造函数
作者:互联网
1.虚继承体系下的构造函数
为了满足虚继承只有一个虚基类子对象的条件(即由最顶层的派生类调用虚基类的构造函数来初始化虚基类子对象),编译器在构造函数中加入一个参数bool _most_derived来判断是否是顶层派生类,如果是则调用拷贝构造函数。可能的伪码如下。
Point3d *Point3d::Point3d(Point3d *this,bool _most_derived) { if(_most_derived) this->Point::Point(x,y); ... }
2.指向虚函数表的指针vptr的初始化
vptr初始化顺序:在基类构造函数调用操作之后(包括虚基类和上一层基类的构造函数),在成员初始化列表中所列的成员初始化操作之前。当然也是由编译器完成。
产生上述结果的原因是:如果我们在类Point3d的构造函数中调用一个虚函数size(),我们当然希望他是调用自己的那个size()而不是基类的。此时可以用静态调用Point3d::size(),但是如果我们在size()中间再调用一个虚函数insize()呢,那insize()不能用静态调用。此时只要还没有初始化Point3d的虚函数表指针,那么虚函数自然无法实现,即insize()只能调用Point3d::insize()了。
注意这个机制还不能处理以下情况:如果在Point3d的构造函数的初始化列表中,要给Point的构造函数提供一个虚函数作为参数,这样是错误的,因为vptr不是没有设置好,就是被设置指向错误的类(成员还没初始化)
Point3d::Point3d():Point(size()){}; //错误
标签:初始化,调用,第五章,基类,size,Point3d,构造函数 来源: https://www.cnblogs.com/wildricky/p/14946503.html