2013-04-18 89 views
0

我使用Win8 VC++ 2012。C++子類不能從父類繼承私有成員?

上面的代碼是顯示在任何情況下的子類B都可以訪問A :: a。我也不能改變A :: a的訪問屬性,但是A :: b和A :: c。

所以A :: c未從A繼承到B.但的sizeof(A)和sizeof(B)分別爲12和24,這意味着A ::一個DO中B.

佔據存儲器
  1. B如何將A :: a存儲在內存中,卻永遠無法訪問它?
  2. 本書C++ Primer說,我們可以恢復基類成員的訪問屬性,但不能改變它。在這裏,我的代碼顯示,我可以在B中將A :: b的訪問屬性從protected更改爲public。爲什麼?

下面的代碼:

#include <iostream> 
using namespace std; 

class A 
{ 
private: 
    int a; 
protected: 
    int b; 
public: 
    int c; 

    A(int a, int b, int c): a(a), b(b), c(c) 
    { 
     cout << "A: "; 
     cout << a << " "; 
     cout << b << " "; 
     cout << c << endl; 
    } 
}; 

class B: protected A 
{ 
private: 
    int d; 
protected: 
    int e; 
    //using A::a; COMPILE ERROR 
public: 
    int f; 
    //A::a; COMPILE ERROR 
    using A::c; //RESTORE A::c public access 
    A::b; // change A::b from protected to public 

    B(int d, int e, int f): A(d, e, f), d(d), e(e), f(f) 
    { 
     cout << "B\n"; 
     //cout << a << endl; COMPILE ERROR 
     cout << b << " "; 
     cout << c << " "; 
     cout << d << " "; 
     cout << e << " "; 
     cout << f << endl; 
    } 
}; 
int main() 
{ 
    A a(1,2,3); 
    B b(4,5,6); 

    cout << "sizeof(A)=" << sizeof(A) << endl; //OUTPUT 12 
    cout << "sizeof(B)=" << sizeof(B) << endl; //OUTPUT 24 
    return 0; 
} 
+0

不要相信'sizeof'能像你期望的那樣工作。 –

+0

另外,你期望什麼? 'private'是'private'。 –

回答

5

孩子繼承父母的私有成員,但他們不能訪問它們。要訪問使他們protected

class A 
{ 
protected: // <<------------ make `a` as protected in parent 
    int a; 
+0

正如我的代碼所示,私有成員A :: a不能在子類中進行保護。 – Zachery

+2

看,我改變了父類,而不是子類。 – deepmax

1

當你使用與派生類的一個實例沿創建的基類的實例繼承。當你實例化一個派生類時,即使它們不能被派生類訪問,基類內部的所有成員都是構造的。

如果您需要該成員在基類中是私有的,但您仍希望在派生類中訪問它。在基類中創建一個受保護的訪問者,這將允許您訪問私有成員。

protected:  
int &geta() { return a; } 
1

所以,A :: c未從A繼承到B

你的意思

所以,A ::一個不是從繼承到B

但即使如此它確實繼承。它只是不能直接訪問。但B仍然會有一個a

這是爲什麼這是必要的?因爲您可以在A中有公共方法,可以設置或獲得值a這些功能可以間接地讓B訪問自己的a

例如

class A { 
private: 
    int a;  // a is private 
public: 
    void set_a(int i) {a = i;} 
}; 

class B : protected A { 
public: 
    using A::set_a; // we bring set_a to public access 
}; 

int main() { 
    B b; 
    b.set_a(2); // change b.a indirectly 
    b.a = 2;  // Error 
} 
+0

A :: c當然是從A繼承到B.它是A的公共成員。@ – Zachery

+0

@營救你也許這就是你寫的:) – stardust

+1

@營養和遺產不依賴於知名度。 **一切都從A **繼承。唯一不同的是可視性級別。 – stardust

0

我看不出是什麼問題:

B是A,這就是爲什麼有一些空間由一個屬性occuped即使B無法訪問它。

如果有一個公共方法geta()返回a,如果a不在b中它怎麼會返回?