簡體   English   中英

為什么在虛擬繼承中調用默認構造函數?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM