2010-08-15 7 views
2

클래스 템플릿에 대한 콜백을 만들려고합니다. 코드는 다음과 같습니다.템플릿 클래스 함수 재정의

template <typename t> 
class Foo { 
    void add(T *t) { 
     prinf('do some template stuff'); 
     on_added(t); 
    } 
    void on_added(T *t) { } 
} 

struct aaa {} 

class Bar : Foo<aaa> { 
    void on_added(aaa *object) { 
     printf("on added called on Bar"); 
    } 
} 

Bar의 on_added 함수는 호출되지 않습니다. 템플릿 하위 클래스가 선택적으로 재정의 할 수있는 콜백을 추가하는 가장 좋은 방법은 무엇입니까? 감사합니다

+2

기본 클래스의 void on_added (...) 앞에 가상을 놓치지 않았습니까? –

+0

예 참으로 고마워요. 새집 실수,이 질문을 삭제해야합니까? – sharvey

답변

4

를 사용하여 '가상'은 ...

template <typename t> 
class Foo { 
    void add(T *t) { 
     prinf('do some template stuff'); 
     on_added(t); 
    } 
    virtual void on_added(T *t) { } 
} 

struct aaa {} 

class Bar : Foo<aaa> { 
    void on_added(aaa *object) { 
     printf("on added called on Bar"); 
    } 
} 
2

Foo의 on_added 함수는 가상 일 필요가 있습니다. 이 템플릿을 특별한 것이 아니라 모든 클래스에 적용

template <typename t> 
class Foo { 
    ... 
    virtual void on_added(T *t) { } 
}; 

참고 : 파생 클래스에서 구현을 사용하기 위해 기본 클래스에서 호출을 원하는 경우

0

당신은 기능 virtual을해야한다.

0

모두가 이미 다른 질문에 대답했다. 가상 함수를 추가하면 클래스의 이전 버전과의 호환성이 손상된다는 것을 추가하겠습니다. 따라서이 클래스가 사용자가 제어하는 ​​클래스이고 다른 종속 클래스가없는 경우 계속 진행하고 on_added을 가상으로 변환 할 수 있습니다. 그렇지 않으면 종속 모듈도 다시 빌드해야합니다.