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

Why is Default constructor called in virtual inheritance?

本文关键字:调用 Default 构造函数 继承 虚拟 为什么      更新时间:2023-10-16

我不明白为什么在下面的代码中,当我安装类型为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);
}

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

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

daugther(int attr) : grandmother(attr), mother(attr) { ... }

另请参阅此常见问题条目。