【发布时间】:2012-04-12 01:23:10
【问题描述】:
我不明白为什么在下面的代码中,当我实例化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);
}
【问题讨论】:
-
什么编译器(和版本)?你用什么参数编译它?
-
gcc 4.6.3 20120306 (Red Hat 4.6.3-2) 在 fedora 15 上。参数是:-O0 -g3 -Wall -c -fmessage-length=0
-
g++ 4.1.2 也有同样的问题:codepad.org/L0jBXfSP
-
带有 -Wall -pedantic-errors 的 Ubuntu 4.7 快照重现了这一点。
标签: c++ inheritance virtual-inheritance