2010-01-13 11 views
2
나는이 같은 설정에서이 문제를보고 있어요

:파생 클래스는 부모 클래스를 볼 수 없습니다 제대로

namespace ns1 
    { 
    class ParentClass 
    { 
     protected: 
     void callback(); 
    }; 
    } 

    namespace ns1 
    { 
    namespace ns2 
    { 
     class ChildClass : public ParentClass 
     { 
     public: 
     void method() 
     { 
     registerCallback(&ParentClass::callback); 
     } 
     }; 
    } 
    } 
  1. ChildClass에이 :: 방법은() 컴파일 오류를 준다 : "'NS1 :: ParentClass :: callback ':'ns1 :: ParentClass '클래스에서 선언 된 보호 된 멤버에 액세스 할 수 없습니다.
  2. ParentClass *pObj = new ChildClass() 캐스팅하지 않고 변환 할 수 없다는 오류가 발생합니다. C++은 행복하게 다운 캐스팅 할 수 있습니까?
+0

'2.'가 오류를주는 전체 문맥을 게시 할 수 있습니까? –

+0

ParentClass * pObj = 새 ChildClass()는 VC10B2에서 예제 (잘못된 registerCallback 호출을 주석으로 처리)를 사용하여 잘 컴파일하고 있습니다. 오류에 대한 자세한 내용을 게시해야합니다. –

+0

registerCallback이 잘못된 이유는 무엇입니까? –

답변

6

변경 :

registerCallback(&ParentClass::callback); 

...에 :

registerCallback(&ChildClass::callback); 

&에 ParentClass :: 콜백 ChildClass에의 만에서 맥락에서 해결되지 정규화 된 유형 이름이기 때문에 그 이유는 글로벌 컨텍스트. 다른 말로하면 다음과 같은 문제입니다 :

class Thingy 
{ 
protected: 
    virtual int Foo() {}; 
}; 


int main() 
{ 
    Thingy t; 
    t.Foo(); 
    return 0; 

} 
+0

그것은 흥미 롭습니다; 당신은 ParentClass :: callback()을 method() 내부에서 호출 할 수는 있지만 포인터를 사용하면 오류가 발생합니다. 왜 그런가요? – ceo

+0

도움이되는 설명으로 수정되었습니다. –

-1

공개 기능을 선언합니다. 과를 통해 액세스 - - 파생 클래스 인스턴스

+1

이것은 값싼 해킹 일뿐입니다. –

+1

글쎄, 가상 소멸자, 그게 유효한 지점입니다 ... – daramarak

+0

@ daramarak : 공정한 가리 킵니다. –

3

그 기본 클래스의 인스턴스 인 경우 기본 클래스의 보호 된 멤버 만 액세스 할 수있는 파생 클래스 .. 그 기본 클래스는 가상 소멸자를 가지고 있는지 확인하십시오. 파생 클래스는 다른 유형의 기본 클래스의 보호 된 멤버에 액세스 할 수 없습니다.

편집 : 멤버에 대한 포인터를 형성하는 경우, 기본 클래스의 protected 멤버는 사용할 수 있지만 범위에 사용 된 이름은 멤버 이름이 파생 클래스 이름이 아닌 기본 클래스 이름이어야합니다 그래서이 ' 액세스 할 수 없습니다 '오류가 올 바릅니다.

using ns1::ParentClass;using ns1::ns2::ChildClass;ChildClass이라는 완전한 선언 이후에 외부 범위에 있습니다. 귀하의 진술에 오류가 없습니다.

+0

파생 클래스 인스턴스를 통해 액세스 중입니다. –

+0

아니요, '& scope :: member_name'을 사용하여 멤버에 대한 포인터를 만들 때 인스턴스가 없습니다. –

+0

그러나 생성 된 오류가 올바른 _real_ 이유를 추가하여 편집했습니다. 이 작업과 관련된 인스턴스가 없더라도 멤버에 대한 포인터를 만들 때 기본 클래스의 보호 된 멤버에 액세스 할 수 있습니다. –

관련 문제