gpt4 book ai didi

c++ - 为什么在虚拟继承中调用默认构造函数?

转载 作者:太空宇宙 更新时间:2023-11-04 13:45:08 25 4
gpt4 key购买 nike

我不明白为什么在下面的代码中,当我实例化一个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) { ... }

另见 This FAQ entry .

关于c++ - 为什么在虚拟继承中调用默认构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26344020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com