簡體   English   中英

為什么基本構造函數會被繼承,我該如何預防?

[英]Why are base Constructors inherited, How can i prevent it?

#include<iostream>
using namespace std;

int main(){
    class c1{
        public:
        c1(){
            cout<<"constructing c1";
        }

    };


    class c2:private c1{
        public:
        c2(){
            cout<<"constructing c2";
        }
    };
    c2 inst1;

}

q1。 即使訪問是私有的,為什么基地的指揮官也需要派生對象? 即為什么即使類c1被繼承為私有也為什么調用c1()

q2。 在這里c1是繼承的,我如何防止這種情況發生?

它不是繼承的。 c2 c1 有一個c1子對象是c2對象的一部分。

任何對象都需要構造才能使用,因此c2構造函數將自動調用c1 c'tor(因為它沒有參數,並且可以用於默認構造)。

如果您想了解更多有說服力的,出現這種情況,請嘗試將參數傳遞給c1 c'tor:

c1(int){
    cout<<"constructing c1";
}

現在它不能用於默認構造c1 您將得到一個不錯的錯誤,可以通過使用一些整數值顯式調用c2的基類c'tor來解決該錯誤:

c2() : c1(0) {
    cout<<"constructing c2";
}

這與私有或公共繼承無關。 派生類的構造函數在基類的構造函數被調用之后被調用,析構函數以相反的順序被調用。

這是面向對象編程的基本要點

在繼承c1的情況下,如何防止這種情況發生?

簡短答案:您無法阻止。 all parent objects as sub-objects, due to their inheritance. 由於繼承,派生對象將所有父對象為子對象。 因此,為了整體上初始化對象,編譯器別無選擇,只能為每個子對象調用每個構造函數。

但是,可以通過使用某些參數調用父構造函數的行為來影響它的行為。 考慮一下:

class Base {
    Data _data;
protected:
    Base(bool load_from_cache) {
        if(load_from_cache) _data = read_cache();
        else _data = read_database();
    }
};

class Derived : public Base {
public:
    Derived() : Base{ true } { } // specify from where to read the data
};

注入自定義行為還有很多其他可能性,例如傳遞函數對象,lambda,CRTP等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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