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

Sim*_*ges 73 c++ inheritance virtual-inheritance

我不明白为什么在下面的代码中,当我实例化一个类型的对象时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);
}
Run Code Online (Sandbox Code Playgroud)

int*_*jay 77

使用虚拟继承时,虚拟基类的构造函数由最派生类的构造函数直接调用.在这种情况下,daughter构造函数直接调用grandmother构造函数.

由于您没有grandmother在初始化列表中显式调用构造函数,因此将调用默认构造函数.要调用正确的构造函数,请将其更改为:

daugther(int attr) : grandmother(attr), mother(attr) { ... }
Run Code Online (Sandbox Code Playgroud)

另请参阅此FAQ条目.

  • @ Youda008它将被调用一次.来自`mother`的调用将被忽略,除非你直接实例化`mother`而不是派生类. (4认同)
  • 这完全有道理,谢谢!层次结构中的所有构造函数都是从最后一个类调用的,而不是由它们各自的子类调用的.没想到这一点.有时C++规范可能很棘手...... (2认同)
  • 这是否意味着奶奶会被叫两次?妈妈体内对祖母的呼唤会发生什么? (2认同)