为什么在虚拟继承中调用Default构造函数
Why is Default constructor called in 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);
}
使用虚拟继承时,虚拟基类的构造函数由最派生类的构造函数直接调用。在这种情况下,daughter
构造函数直接调用grandmother
构造函数。
由于您没有在初始化列表中显式调用grandmother
构造函数,因此将调用默认构造函数。要调用正确的构造函数,请将其更改为:
daugther(int attr) : grandmother(attr), mother(attr) { ... }
另请参阅此常见问题条目。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 为什么在虚拟继承中调用Default构造函数
- 从具有Default Constructor的类中调用对象
- "No appropriate default constructor available" --为什么还要调用默认构造函数?