虛擬繼承中的預設建構子呼叫
虛擬繼承是一種C繼承機制,旨在解決菱形繼承或重複繼承的問題。在這種情況下,就出現了一個問題:為什麼在實例化衍生類別物件時會呼叫虛擬基底類別的預設建構子?
這種行為源自於虛擬繼承的設計。與傳統繼承中衍生類別建構函式透過初始化列表呼叫基底類別建構子不同,在虛擬繼承中,最底層衍生類別的建構子直接呼叫虛擬基底類別的建構子。
中提供的範例:
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; } };
當實例化女兒類型的物件時,女兒建構子直接呼叫祖母建構子。但是,由於子構造函數的初始化列表中沒有調用特定的構造函數,因此預設調用祖母的預設構造函數。
要明確調用所需的構造函數,必須修改子構造函數的初始化列表to:
daughter(int attr) : grandmother(attr), mother(attr) { ... }
通過這樣做,正確的祖母構造函數被調用,輸出將包括以下行:
grandmother: 0
在使用virtual 時理解這種行為是至關重要的繼承,因為它確保正確的初始化和物件構造。
以上是為什麼實例化衍生類別物件時會呼叫虛擬基底類別的預設建構子?的詳細內容。更多資訊請關注PHP中文網其他相關文章!