2012-01-31 3 views
0

추상이 아닌 경우 기본 클래스 메서드를 호출하는 방법. 추상이 아닌 경우 기본 클래스 메서드 호출

class WithAbstMethod { 
public: 
    virtual void do() = 0; 
} 

class WithImplMethod : public WithAbstMethod { 
public: 
    virtual void do() { 
     // do something 
    } 
} 

template<typename BaseT> 
class DerivedClass : BaseT { 
public: 
    virtual void do() { 
     BaseT::do(); // here is a question. How to modify code, so that do() is called if it is not abstract? 
     // do something 
    } 
} 

void main() { 
    DerivedClass<WithAbstMethod> d1; 
    d1.do(); // only DerivedClass::do() should be called 
    DerivedClass<WithImplMethod> d2; 
    d2.do(); // both WithImplMethod::do() and DerivedClass::do() should be called 
} 

은 많은 코드없이 컴파일 타임이 사용하는 템플릿을 할 수 있나요 (인스턴스화 DerivedClass : BaseT 연결 :: DO() 호출을하고 BaseT 연결 유형에 따라없이 할() 메소드)? 분명히 WithAbstMethod 클래스에서 구현을 제공하는 것은 옵션이 아닙니다. 위의 코드는 의사 코드이므로 사소한 오류가있을 수 있습니다.

+3

do는 C++의 예약어입니다. –

답변

3

사실, WithAbstMethod::do()에 대한 구현을 제공하는 것이 옵션 일 수 있습니다. 추상 함수는 구현을 가질 수 있습니다.

void WithAbstMethod::do() 
{ 
    // do nothing... 
} 
+0

나는 무엇을 의미하는지 잘 모르겠습니다. 이 방법은 설계 상 추상적이어야합니다. 그래서 같은 코드에서 컴파일 타임 오류 : void main() {WithAbstMethod a1; } – cos

+1

음,'void main()'에 대한 컴파일 타임 오류가 발생했습니다. 그건 제외하고'WithAbstMethod :: do()'가 추상 클래스 인 경우 구현 한 경우에도 여전히 컴파일 타임 오류가 발생합니다! 아 - 추상적 인 멤버를 구현할 수 있다는 것을 알지 못했을 것입니다. 'struct A {void B() = 0; }; void A :: B() {}'구현 된 추상 함수 A :: B()가있는 추상 클래스 'A'입니다. 이것은 예를 들어. 귀하의 경우에 유용합니다. –

+1

컴파일러는 추상 클래스를 인스턴스화 할 수 없습니다 (즉, 함수 선언에'= 0'을 남겨 둡니다). 그러나 파생 클래스가 호출 할 수있는 추상 함수에 대한 구현을 여전히 허용 할 수 있습니다. 멋지게 쉽게 작동 할 수있는'void' 함수; 반환해야 할 추상 함수가 있고 합리적인 '기본값'이없는 경우에도 적합하지 않을 수 있습니다. –

관련 문제