继承与模板

问题描述:

#include<iostream> 

using namespace std; 

class C 
{ 
public: 
C(){}; 
virtual void nothing()=0; 
virtual ~C(){}; 
}; 

class A : public C 
{ 
public: 
A(){}; 
virtual void nothing(){}; 
}; 
class B:public A 
{ 
public: 
B(){}; 
void nothing(){}; 
}; 

template <class T> 
void hi(T){ 
cout << " i am something\n"; 
} 

template <> 
void hi<A>(A) 
{ 
cout << " I am A\n"; 
} 

template <> 
void hi<B>(B) 
{ 
cout << " I am B\n"; 
} 

int main () 
{ 
C *array [] = {new A,new B}; 
hi (*array [0]); 
hi (*array [1]); 

delete array [0]; 
delete array [1]; 
return 0; 

} 

日期: 我有事 我有事继承与模板

目前我正在写有处理
继承类型和专门的模板程序。在上面的例子中,我想我想看到 我是A 我是B 有没有办法正确调用对象的函数,虽然我正在处理基类数组?我不确定通过dynamic_cast进行类型检查和转换是最优雅的解决方案。请注意,这只是一个较大程序的摘录。 谢谢您提前

+1

您试图多态使用您的对象,但模板实例化发生在编译时。正如您所建议的,您需要运行时类型检查。 – 2015-02-17 23:58:51

在主程序中,下面显示的三行创建一个C*的数组。 因此,无论 元素的实际类型是什么,该数组中的任何元素都被视为C*。 也就是说,当您将*array [0]传递给函数hi(), 时,被调用的函数是hi(C),该函数解析为 函数,而不是专用函数中的任一个。

C *array [] = {new A,new B}; 
hi (*array [0]); 
hi (*array [1]); 

为了使hi<A>被调用,您必须把指针 存储到新的对象中A*类型的变量,或者你需要转换 C*A*

在类似这样的情况下,的C虚拟功能,在AB重写时, 可以达到目的更好。