2011-11-01 4 views
3

템플릿의 초기 바인딩과 가상 함수의 후기 바인딩. 따라서 템플릿에 가상 함수가 포함되어 있으면 안전합니까?템플릿에 가상 기능이 포함되어 있어도 안전합니까?

template<typename T> 
class base { 
public: 
    T data; 
    virtual void fn(T t){} 
}; 
+2

문제가 있습니까? 어떻게 제대로 작동하는지 확인하는 프로그램을 작성 하시겠습니까? 이 프로그램을 실행하면 어떻게됩니까? –

답변

9

완전히 안전합니다. 클래스 템플릿을 인스턴스화하면 다른 클래스처럼 일반 클래스가됩니다.

template<typename T> 
class base { 
public: 
    T data; 
    virtual void fn(T t){} 
}; 


class derived : base<int> { 
public: 
    virtual void fn(int t){} //override 
}; 

base<int> *pBase = new derived(); 
pBase->fn(10); //calls derived::fn() 

나는 또한 클래스 템플릿에서 가상 함수를 허용하는 동안 (아래 그림 참조),이 클래스 내에 가상 함수 템플릿을 허가되어 있지 않은 것을 지적하고 싶습니다이

class A 
{ 
    template<typename T> 
    virtual void f(); //error: virtual function template is not allowed 
}; 
+0

어떻게 가상 함수 템플릿입니까? – krammer

+0

@krammer : 함수 템플릿이기 때문에'virtual' 키워드로 선언되므로 가상 함수 템플릿이됩니다. – Nawaz

+0

오 감사합니다. 나는 가상 이전에 개행을 잘못 읽었다. – krammer

0

template 클래스의 virtual 기능과 관련된 안전 문제는 없습니다. 정상적인 class 안에 virtual 기능이있는 것처럼 좋습니다.

1

예, 꽤 안전합니다. 당신은 클래스를함으로써 그것을 사용하는 거라고는 그것에서 파생 : 물론

class derived : public base<int> { 
    virtual void fn(int) { std::cout << "derived"; } 
}; 

, 그것은 다른 가상 함수를 포함하는 경우 당신은 일반적으로 만들고 싶어 (즉, 기본 클래스로 사용하기위한 것입니다) dtor 가상도 마찬가지입니다.

관련 문제