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