首頁 > 後端開發 > C++ > 為什麼實例化衍生類別物件時會呼叫虛擬基底類別的預設建構子?

為什麼實例化衍生類別物件時會呼叫虛擬基底類別的預設建構子?

Linda Hamilton
發布: 2024-11-20 04:22:02
原創
691 人瀏覽過

Why is the Default Constructor of a Virtual Base Class Invoked when a Derived Class Object is Instantiated?

虛擬繼承中的預設建構子呼叫

虛擬繼承是一種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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板