2010-08-14 7 views
0

기본 클래스의 기본 클래스에서 재정의 된 멤버에 어떻게 액세스합니까?재정의 된 요소의 여러 수준에 액세스하는 방법은 무엇입니까?

#include <iostream> 
using namespace std; 

class A {public: char x; A(){x='A';};}; 
class B1 : public A {public: char x; B1(){x='B';};}; 
class B2 : public A {public: char x; B2(){x='B';};}; 
class C : public B1, public B2 {public: char x; C(){x='C';};}; 

int main(){ 
    C c; 
    cout << c.x << endl; // prints C 

    cout << c.B1::x << endl; // prints B 
    cout << ((B1&) c).x << endl; // prints B 

    // cout << c.A::x << endl; // normally prints A but doesn't work here 
    cout << ((A&) c).x << endl; // prints A 
    return 0; 
} 

참조 (또는 포인터)가 유일한 방법입니까? 범위 연산자를 연결하기 위해 A :: B :: x를 시도했지만 작동하지 않습니다. "double A"를 유지하려고합니다. 즉, 상속 가상을 만들지 않습니다.

((B&) c).xc.B::x에 좋은 "임시 해결책"인 것처럼 보이지만 가상 함수의 경우에는 같지 않습니까?

답변

1

당신은 참조 캐스트를 더한 범위 지정 연산자를 통해 두 버전에 액세스 할 수 있습니다,이를 추천했습니다 : ((B1&) c).A::x((B2&) c).A::x.

cout << ((A&) c).x << endl; 컴파일러가 A의 데이터 복사본을 알고 싶지 않기 때문에 컴파일러에서 오류가 발생합니다.

+0

좋은 조합 참조 캐스트 및 범위 op 모든 문제를 해결하는 것으로 보인다. 아무도 다른 문제가 생기지 않는다면 받아 들일 것입니다 ... –

1
c.A::x 
+0

그래 좋아 ... 문제는 나는 그것이 상속의 단지 여러 수준에서 간단하게 할 수 있지만, 사실 문제가보다 사라 생각 ... 다중 상속 내놓았다에게 있습니다. 그것을 가리키는 thx :-) - op 편집 –

0

작동하지 않으며 컴파일러가 이유를 말해야합니다. 적어도 내 것은 :-) : "C의 모호한 기반". 대답은 가상 상속

#include <iostream> 
using namespace std; 

class A {public: char x; A(){x='A';};}; 
class B1 : public virtual A {public: char x; B1(){x='B';};}; 
class B2 : public virtual A {public: char x; B2(){x='B';};}; 
class C : public B1, public B2 {public: char x; C(){x='C';};}; 

int main(){ 
    C c; 
    cout << c.x << endl; // prints C 

    cout << c.B1::x << endl; // prints B 
    cout << ((B1&) c).x << endl; // prints B 

    cout << c.A::x << endl; // normally prints A but doesn't work here 
    //cout << ((A&) c).x << endl; // prints A 
    return 0; 
} 
+0

나는 모든 B 's를 별개로 유지하고 싶었습니다. THX 어쨌든. –

+0

당신은 질문에 그 것을 명시하지 않았습니다. 왜 내가 따로 보관하길 원하는지 물어봐도 될까요? – celavek

+0

실제로 그랬습니다! 나는이 질문을 읽는 데 더주의를 기울여야했다. – celavek

관련 문제