为什么在虚拟继承中调用Default构造函数?

我不明白为什么在下面的代码中,当我实例化一个类型为object的对象时daughter,grandmother()会调用默认构造函数?


我认为grandmother(int)应该调用构造函数(以遵循我的mother类构造函数的规范),或者由于虚拟继承而根本不应该编译此代码。


在这里,编译器grandmother在我的背后默默地调用默认构造函数,而我从未要求过它。


#include <iostream>


class grandmother {

public:

    grandmother() {

        std::cout << "grandmother (default)" << std::endl;

    }

    grandmother(int attr) {

        std::cout << "grandmother: " << attr << std::endl;

    }

};


class mother: virtual public grandmother {

public:

    mother(int attr) : grandmother(attr) {

        std::cout << "mother: " << attr << std::endl;

    }

};


class daughter: virtual public mother {

public:

    daughter(int attr) : mother(attr) {

        std::cout << "daughter: " << attr << std::endl;

    }

};


int main() {

  daughter x(0);

}


慕码人8056858
浏览 301回答 2
2回答

元芳怎么了

使用虚拟继承时,最派生类的构造函数直接调用虚拟基类的构造函数。在这种情况下,daughter构造函数直接调用grandmother构造函数。由于您没有grandmother在初始化列表中显式调用构造函数,因此将调用默认构造函数。要调用正确的构造函数,请将其更改为:daugther(int attr) : grandmother(attr), mother(attr) { ... }

拉风的咖菲猫

完全有道理,谢谢!层次结构中的所有构造函数都是从最后一个类调用的,而不是从它们各自的子类调用的。没想到。C ++规范有时可能很棘手……&nbsp;
打开App,查看更多内容
随时随地看视频慕课网APP