2014-02-25 2 views
0
struct IA 
{ 
    virtual void Init() = 0; 
    ..... 
}; 

struct A : public IA 
{ 
    void Init() {}; 
    ..... 
}; 

struct B : public A 
{ 
    int Init() { return 1; }; 
}; 

은 내가 오류 C2555있어 : 'B :: 초기화': 재정의 가상 함수 반환 유형 ...감추고 특정 기능은 디자인

내가 어떻게 든 초기화를 은폐 할 수()에서 A, 나는 다른 A의 기능을 은폐하고 싶지 않다. 클래스 A는 B 클래스뿐만 아니라 다른 클래스에서 A 클래스로 사용됩니다.

EDIT : 반환 유형의 차이 만있는 계층 구조에서 두 개의 Init 함수가 있어야합니다. A :: Init은 B 타입의 객체에서 호출 될 필요가 없습니다. 사실 내가

struct B : private A 
{ 
    using A::.... // all, except Init 
    int Init() { return 1; }; 
}; 

에 의해 그것을 할 수 있습니다하지만 기능의 큰 많은으로 인해 상속하는 :(

+0

달성하려는 목표가 명확하지 않습니다. – Brian

+1

아마도'Init' 함수가 가상 일 수 없습니다. – Brian

+0

@Brian Bi, 당신은 대답으로 그것을 넣을 수 있습니다. 그러나 이제는 재미로 나를 위해 직감하고 있습니다. 그래서 다른 답변도 감사하겠습니다. – Yola

답변

1

에있다, 당신의 struct B 두 함수 서명 void Init();int Init();와 C++은 허용하지 않습니다 포함 자신의 반환 형식 만 다를 과부하 방법

가능한 우아 솔루션 :.

  • struct A에있는 void Init(); 메서드를 비공개로 선언하고 공용으로 상속하고 싶은 나머지 메서드는 그대로 유지하여이 오류를 수정할 수 있습니다.
  • 또 다른 해결 방법은 bool과 같은 더미 매개 변수를 추가하고 Init(true) 메서드를 호출하는 것입니다. 이 더미 매개 변수에 대한 기본값을 정의 할 수 없다는 점에 유의하십시오. 그렇지 않으면 동일한 오류가 발생합니다.