2012-05-06 41 views
6

「默認情況下結構具有公共繼承」此聲明的真正含義是什麼?爲什麼下面的代碼出錯,僅僅是因爲在從c派生類d時忽略了關鍵字'public'?「默認情況下結構具有公共繼承」

struct c 
{ 
protected: 
    int i; 
public: 
    c(int ii=0):i(ii){} 
    virtual c *fun(); 
}; 

c* c::fun(){ 
    cout<<"in c"; 
    return &c(); 
} 

class d : c 
{ 
public: 
    d(){} 
    d* fun() 
    { 
     i = 9; 
     cout<<"in d"<<'\t'<<i; 
     return &d(); 
    } 
}; 


int main() 
{ 
    c *cc; 
    d dd; 
    cc = &dd; 
    cc->fun(); 
} 
+0

不要忽略編譯器向您發出的警告。 – moooeeeep

回答

9

這意味着

struct c; 
struct d : c 

相當於

struct d : public c 

您的代碼是延伸的struct一個class

struct c; 
class d : c; 

相當於

class d : private c; 

因爲class默認情況下具有私有繼承。

這意味着所有從c繼承和未覆蓋/重載/隱藏的方法在d中是私有的。

+0

錯誤發生在主'cc =&dd'的第二行。這裏我們簡單地將派生類的地址分配給指向基類的指針。公共和私人遺產與它有什麼關係?帶私人繼承的 – user1232138

+0

@ user1232138,類「d」不是'c'。 – juanchopanza

+0

這個答案有一個錯誤:struct c;類d:c;相當於類d:public c; 「結構具有公共繼承」意味着它們默認被公開繼承。證明:以下代碼編譯:struct A {int x; }; B類:A { void foo(){x = 2; } }; –

2

當您編寫struct並繼承某些內容而未指定訪問說明符時,該繼承將被視爲public。當你編寫一個class並且從某些東西繼承而沒有指定一個訪問說明符(即使這個東西是一個struct),那個繼承就被認爲是私有的。在你的代碼中,你正在做後者,所以繼承是私有的,因此觀察到的錯誤。

換句話說,說struct繼承默認情況下公開實際上意味着繼承寫當struct是公共默認情況下,不從繼承一個struct默認情況下公開進行

5

「的struct公有繼承默認」 的意思,這

struct Derived : Base {}; 

相當於

struct Derived : public Base {}; 

類有私人繼承默認情況下,所以當你刪除public從類繼承你有相當於

class Derived : private Base {}; 

在這種私有繼承的情況下,Derived不具有是,一個關係與Base,它本質上有-一個Base。因此,您嘗試在此嘗試的轉換爲:

cc = &dd; 

是不允許的。