第五章:构造函数

  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()){};  //错误

  

上一篇:C++/Lua交互相关问题(记录用)


下一篇:实验一 Java开发环境的安装与配置