2014-10-02 84 views
0

無論您如何繼承基類(私有或受保護或公共),我都會發現無處不在基類的私有成員永遠不會繼承於派生類中。基類的私有成員是否始終在C++的派生類中繼承?

但下面的問題讓我很困惑。我不知道爲什麼這個程序的輸出是80.它應該是1個字節(這是C++中空類的大小),因爲私有成員永遠不會被繼承。

#include<iostream> 
using namespace std; 

class base 
{ 
    int arr[10]; 
}; 

class b1: public base { }; 

class b2: public base { }; 

class derived: public b1, public b2 {}; 

int main(void) 
{ 
    cout << sizeof(derived); 
    return 0; 
} 
+8

您看到了錯誤的。基類中的所有內容都由派生類型繼承。 – juanchopanza 2014-10-02 12:58:02

+9

私有成員在派生類中是繼承的,但不是* visible *。 – 2014-10-02 12:59:24

+0

「基類中的所有東西都是派生類型繼承的」我會說:所有基類**中的所有東西都被派生類型繼承。這就是爲什麼你有80個字節 - sizeof(b1)+ sizeof(b2) – borisbn 2014-10-02 13:06:12

回答

3

這主要是語義和什麼不同的人指的是與繼承的問題。當類型D繼承自B類型時,每個D對象包含一個完整的B對象。從這個角度來看,所有的成員都是那裏有(有的人把這稱爲繼承了)。另一方面,這些成員不是易於獲得D的成員,並從這一角度來看,成員好像他們不在那裏(有些人稱這個沒有繼承)。一個基地(不管是什麼無障礙環境)的

私有成員都是從派生類型(假設沒有友誼關係)訪問,但它們的存在,派生類型的對象包含基本類型的對象。

+0

也注意到派生類可以覆蓋聲明爲虛擬的基類的私有成員函數。派生類不能調用這些成員函數的基本版本,但可以覆蓋它們。在這個意義上,派生類繼承基類的私有接口。 – YoungJohn 2014-10-02 14:16:22

1

是的,派生類繼承其所有基類的成員。

私人,公共和受保護的關鍵字僅影響其應用於的項目的可訪問性。如果在特定的上下文中無法訪問某些內容,並且您嘗試使用它,則編譯器會給您一個錯誤。

相關問題