2010-06-13 73 views
2
#include<stdio.h> 

class A {public: int a; }; 
class B: public A {private: int a;}; 

int main(){ 
    B b; 
    printf("%d", b.a); 
    return 0; 
} 

#include<stdio.h> 

class A {public: int a; }; 
class B: private A {}; 

int main(){ 
    B b; 
    printf("%d", b.a); 
    return 0; 
} 

我問,因爲我得到不同的錯誤:這兩段代碼有什麼區別嗎?

error: 'int B::a' is private 

error: 'int A::a' is inaccessible 

除了什麼錯誤可能會顯示,有任何差別在這兩個代碼的行爲?

回答

2

它們是不同的。首先,您正在創建兩個變量「a」的實例。一個在基類中,一個在子類中。在這兩個示例中,您都無法訪問該變量。

如果您有:

A *pA = new B(); 
pA->a; // This will refer to A::a, which is allowed as it was defined public. 

B *pB = new B(); 
pB->a; // This will refer to B::a, which you can't get access to. 

如果要隱藏訪問的「a」變量,我建議第二個例子中,使用私有繼承。請注意,私有繼承也會使基類中定義的任何函數變爲私有。

+0

在第二個例子中,也'了'會在那裏,但無法訪問。所以,有什麼區別? – Moeb 2010-06-13 18:36:47

+0

@Poiuyt:有幾點不同,其中一個顯然是宣言,Mark指出的其中一些。也許你需要澄清你的意思是「有什麼不同?」。 – Stephen 2010-06-13 19:10:04

+0

@Poiuyt:在第一個例子中,它與「a」不一樣。這是一個不同的'a',它掩蓋了'A :: a'。 – 2010-06-13 19:44:05

2

在第一個示例中,類B有兩個成員a,它從類A繼承的成員和它自己定義的成員。 B類的對象最終被作爲一個結果時,你仍然可以訪問類Aa明確成員:因爲私有繼承的

#include <stdio.h> 

class A {public: int a; }; 
class B: public A {private: int a;}; 

int main() 
{ 
    A a; 
    B b; 
    printf("sizeof(a) == %d, sizeof(b) == %d\n", sizeof(a), sizeof(b)); 

    b.A::a = 42; 
    printf("%d\n", b.A::a); 

    return 0; 
} 
+0

ohh。不應該有名稱衝突嗎? [兩個同名的變量](http://codepad.org/P132YXxr)? – Moeb 2010-06-13 19:18:07

+0

@Poiuyt:兩個變量被命名爲'a'是合法的,因爲它們有不同的範圍。它類似於具有全局變量'a',然後在函數內定義一個局部變量'a'。局部變量將隱藏全局變量,儘管您仍然可以通過使用':: a'來訪問全局變量。 – 2010-06-14 01:08:18