为什么在虚拟inheritance中调用Default构造函数?
我不明白为什么在下面的代码中,当我instanciate daughter
types的对象,默认的grandmother()
构造函数被调用?
我认为应该调用grandmother(int)
构造函数(遵循mother
类构造函数的规范),否则这个代码根本不应该编译,因为虚拟inheritance。
这里编译器默默地在我的后面调用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); }
当使用虚拟inheritance时,虚拟基类的构造函数被大多数派生类的构造函数直接调用。 在这种情况下, daughter
构造函数直接调用grandmother
构造函数。
由于您没有在初始化列表中明确地调用grandmother
构造函数,因此将调用默认的构造函数。 要调用正确的构造函数,请将其更改为:
daugther(int attr) : grandmother(attr), mother(attr) { ... }
另见这个FAQ条目 。