2013-07-26 2 views
0

나는 모든 데이터 보호에이C++ 보호 유산

class AUnit {int var... int getVar() const = 0 ... } 

같은 가상 순수에서 변수의 getter/setter를 가진 추상 클래스 AUnit 있습니다.

나는 내가 getter 및 setter의 코드를 작성, 자신의 .cpp에서이

class Berserk : public AUnit 
{ 
... 
private: 
int getVar() const; 

처럼 자식으로 광포와 탱크가 있습니다. 특별한 것은 없습니다.

내가 보호하여 개인 키워드 변경 광포 또는 탱크의 데이터에 액세스 할 필요가
class Foo : public Berserk, public Tank 

하지만이 같은 다른 하나 개의 클래스 (예를 들어, foo는) 이곳 오류는 다음과 같습니다

Tank.hpp:36:25: erreur: ‘virtual int Tank::getY() const’ is protected 
error inside the context 

우선, 나는 AUnit 게터로 데이터에 액세스하려고 시도했지만 가상의 순수하고 추상적 인 개념의 원인으로 인해 순수하지 않은 공개 모드에서 AUnit의 getType을 전달한 후 실제 형식으로 내 AUnit을 다시 해석하도록 생각했습니다. . 아직 작동하지 않는, 내가 이전에 말한 그 계획.

그건 그냥 고전적인 유산 일 뿐이에요. 제가 도와 드릴까요?

+0

''Foo : public Berserk, public Tank''에서는 비공개 란 뜻인가요? – hivert

+0

좀 더 설명해 주시겠습니까? 나는 당신의 '질문'과 당신의 문제에 대한 비전을 이해할 수 없다. – Khelben

+0

[죽음의 다이아몬드] (http://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem)와 같은 소리가납니다. – reima

답변

0

일반적으로 재정의하는 기능에 우선하는 기능보다 엄격한 액세스 보호 기능을 부여하는 것은 좋지 않습니다. 고려 : (즉, 다소 특이한 비록, 또는 더 편안 액세스 수준)

class Base { 
public: 
    virtual void f() {} 
}; 

class Derived : public Base { 
private: 
    virtual void f() {} // overrides Base::f 
}; 

Derived d; 
d.f(); // error - f is private 
Base* pb = &d; 
pb->f(); // OK - calls d.f() 

이 같은 모순을 피하기 위해, 원본과 동일한 액세스 수준에서 재정의를 넣어 신중한입니다.

1

코드를 잘랐다면 분명히 불완전합니다. 내 생각 엔 당신이 다음과 같은 것을 가지고있다 :

int Foo::f(Tank const* tank) { 
    return tank->getY(); 
} 

(아마도 당신은 그것을 돌려주는 것보다 가치있는 것을하고있다). 개체가 tank으로하는 Foo 객체로 알려져 있지 지적 때문에

Tank::getY()에 대한 액세스 protected 비록 클래스 Foo는 위의 코드에서 getY()에 액세스 할 수 없습니다 : 클래스가 protected 회원 만 액세스 할 수 있습니다 자체 유형의 기본 객체에서! 즉, 다음은 OK 것 :

int Foo::f(Foo const* foo) { 
    return foo->getY(); 
} 
은 지금까지 내가 기본 클래스에서 합리적인 아닌 사소한 구현을 가지고 protected virtual 멤버 함수에 대한 발견 한 유일한 잘 사용은에서 호출

[더] 파생 클래스를 멤버를 재정의하는 일부로 포함합니다. 이 방법은 기능을 추가 할 수 있으며 일반적인 로직을 사용할 수 있습니다 (물론 virtual 기능은 이 아니며 이 아니라 private 또는 protected).

+0

나는 당신의 대답 덕분에 교정을 찾고 있습니다. 그러나 나는 한가지 바보 같은 질문을했습니다. 고양이가 될 수있는 동물이 있다면 고양이 : 공개 동물. 나는 고양이를 동물로 사용할 수 없다. 모든 경우가 아니라 모든 동물을 조작 할 수있다. 왜냐하면 Foo는 탱크의 아이들이다. 그렇다면 나는 탱크의 getter를 사용하여 나의 Foo를 조작한다. 보호받는거야? 내 사용을 위해, 나는 진짜 형식을 필요로하지 않는다, 초록은 괜찮다. – Khelben

+0

이 경우에는 * your * 유형, 즉'Foo' 유형으로이 작업을 수행 할 수 있습니다. 그러나 타입이'Foo'라고 정적으로 알려져 있지는 않지만'Tank' 타입으로 만 알려져있는 객체로는 이것을 할 수 없습니다. 즉, '보호 된 (protected)'액세스는 상기 파생 된 유형의 객체에 액세스하기 위해 파생 된 유형의 멤버에게만 부여됩니다. –

+0

죄송합니다. 이메일을 사용하여이 3 가지 과정을 성공적으로 처리하는 방법에 대한 구체적인 아이디어를 얻기 위해 3 가지 수업을 보내주십시오. foo 등을 사용하여 설명하기가 어렵습니다. – Khelben