[英]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.