템플릿의 초기 바인딩과 가상 함수의 후기 바인딩. 따라서 템플릿에 가상 함수가 포함되어 있으면 안전합니까?템플릿에 가상 기능이 포함되어 있어도 안전합니까?
template<typename T>
class base {
public:
T data;
virtual void fn(T t){}
};
템플릿의 초기 바인딩과 가상 함수의 후기 바인딩. 따라서 템플릿에 가상 함수가 포함되어 있으면 안전합니까?템플릿에 가상 기능이 포함되어 있어도 안전합니까?
template<typename T>
class base {
public:
T data;
virtual void fn(T t){}
};
완전히 안전합니다. 클래스 템플릿을 인스턴스화하면 다른 클래스처럼 일반 클래스가됩니다.
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
};
을 template
클래스의 virtual
기능과 관련된 안전 문제는 없습니다. 정상적인 class
안에 virtual
기능이있는 것처럼 좋습니다.
예, 꽤 안전합니다. 당신은 클래스를함으로써 그것을 사용하는 거라고는 그것에서 파생 : 물론
class derived : public base<int> {
virtual void fn(int) { std::cout << "derived"; }
};
, 그것은 다른 가상 함수를 포함하는 경우 당신은 일반적으로 만들고 싶어 (즉, 기본 클래스로 사용하기위한 것입니다) dtor 가상도 마찬가지입니다.
문제가 있습니까? 어떻게 제대로 작동하는지 확인하는 프로그램을 작성 하시겠습니까? 이 프로그램을 실행하면 어떻게됩니까? –