2013-03-30 2 views
1

기본 클래스의 존재 여부에 따라 가상 함수를 구현하는 데 도움이되는 관용구가 있습니까? 예를 들어, 나는자매 클래스에 따라 가상 함수를 자동으로 구현

class B {/* some abstract interface. */}; 

class A 
{ 
public: 
    virtual B* getB() {return nullptr;} 
}; 

class C : public A, public B 
{ 
public: 
    B* getB() override {return this;} 

    /* Implement B's interface here.*/ 
}; 

을하고 난 보통 이런 getB을 구현하려는 - 어떻게 든 모든 잎 클래스에 대해이 작업을 반복하는 것을 피하기 수 있을까? 나는 잠재적으로 B와 같은 몇 가지 인터페이스 클래스를 가지고있다.

나는 그것을 할 수있는 한 방법이 C와 B 모두에서 A로부터 상속 받는다는 것을 안다.하지만 가능하다면 B와 A의 관계를 유지하고 싶다. .

답변

4

당신은에서 모든 작업을 수행 할 수 있습니다

class A 
{ 
public: 
    virtual B* getB() {return dynamic_cast<B*>(this);} 
}; 

참고 : 여기 virtual 그냥 클래스 다형성, dynamic_cast의 사용을 요구하는 것입니다. getB()을 무시하지는 않습니다.

+0

이 방법은 "dynamic_cast"를 사용하기위한 요구 사항입니까? 아니면 하위 클래스의 함수를 재정의하는 것입니까? – dyp

+1

C++ 11 5.2.7 동적 캐스트는 '그렇지 않으면 v는 포인터 여야합니다 to 또는 lvalue를 반환한다. 이것은 다른 경우들 중 하나이다. 다운 소스와 크로스 캐스트의 소스 타입은 다형성이 필요하다. – fizzer

+1

'getB()'자체가 가상 일 필요는 없다 if A는 다른 가상 함수를 가지고 있습니다 – fizzer

관련 문제