【问题标题】:Inheritance with templates使用模板继承
【发布时间】:2015-04-18 20:24:47
【问题描述】:
#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; 

} 

输出: 我是东西 我是个东西

目前我正在编写一个必须处理的程序
继承的类型和专门的模板。在上面的例子中,我希望看到 我是一个 我是乙 尽管我正在处理基类数组,但有没有办法正确调用与对象对应的函数?我不确定通过 dynamic_cast 进行类型检查和转换是否是最优雅的解决方案。请注意,这只是一个较大程序的摘录。 提前谢谢你

【问题讨论】:

  • 您尝试多态地使用您的对象,但模板实例化发生在编译时。正如您所建议的,您需要运行时类型检查。

标签: class templates inheritance base


【解决方案1】:

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

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

为了使hi&lt;A&gt;被调用,你要么必须存储指针 到A* 类型变量中的新对象,或者您需要强制转换 C*A*

在这种情况下,C 的虚函数在AB 中被覆盖, 可能会更好地达到目的。

【讨论】:

    猜你喜欢
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 2013-12-13
    相关资源
    最近更新 更多