2010-06-13 3 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'변수에 대한 액세스를 숨기려면, 나는 개인 상속을 사용하여, 두 번째 예제를 제시한다. private 상속은 또한 기본 클래스에 정의 된 함수를 private으로 만듭니다.

+0

을하지만, 접근 할 수 없다. 그래서, 차이점은 무엇입니까? – Moeb

+0

@Poiuyt : 몇 가지 차이점이 있습니다. 하나는 분명히 선언이고, 일부는 Mark가 지적한 것입니다. 어쩌면 당신은 "차이점은 무엇입니까?"라는 의미를 명확히해야 할 것입니다. – Stephen

+0

@Poiuyt : 첫 번째 예에서는 'a'와 같지 않습니다. A :: a를 마스킹하는 것과는 다른 'a'입니다. –

2

첫 번째 예에서 클래스 B에는 a이라는 두 멤버가 있고이 멤버는 클래스 A에서 상속 받고 자신을 정의한 멤버입니다. 클래스 B의 목적은 결과적으로 더 큰 것을 끝, 당신은 여전히 ​​명시 적으로 클래스 Aa 멤버에 액세스 할 수 있습니다,`A`가있을 것 때문에 개인 상속, 또한 두 번째 예에서

#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

오. 이름 충돌이 있을까요? [같은 이름의 두 변수] (http://codepad.org/P132YXxr)? – Moeb

+0

@Poiuyt : 두 변수의 범위가 서로 다르기 때문에 두 변수의 이름을 모두 'a'로 지정하는 것은 합법적입니다. 이것은 전역 변수'a'를 갖는 것과 유사하고, 함수 내에서 지역 변수'a'를 정의합니다. 지역 변수는 전역 변수를 숨기지 만,':: a'를 사용하여 전역 변수에 접근 할 수 있습니다. –

관련 문제