继承与模板
问题描述:
#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进行类型检查和转换是最优雅的解决方案。请注意,这只是一个较大程序的摘录。 谢谢您提前
答
在主程序中,下面显示的三行创建一个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
虚拟功能,在A
和B
重写时, 可以达到目的更好。
您试图多态使用您的对象,但模板实例化发生在编译时。正如您所建议的,您需要运行时类型检查。 – 2015-02-17 23:58:51