[英]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) { ... }
另请参阅此常见问题条目。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.