使用模板继承
Inheritance with templates
#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;
}
输出:
我是什么
我是东西
目前我正在写一个程序,需要处理
继承类型和专用模板。在上面的示例中,我希望看到
我是一个
我是乙
尽管我处理的是基本 class 数组,但有没有办法正确调用与对象对应的函数?我不确定通过 dynamic_cast 进行类型检查和转换是否是最优雅的解决方案。请注意,这只是一个较大程序的摘录。
提前谢谢你
在主程序中,如下所示的三行创建了一个C*
的数组。
因此,该数组的任何元素都被视为 C*
而不管
元素的实际类型是什么。
也就是说,当你将 *array [0]
传递给函数 hi()
时,
被调用的函数是 hi(C)
解析为
通用 hi
函数,而不是任何一个专用函数。
C *array [] = {new A,new B};
hi (*array [0]);
hi (*array [1]);
为了使 hi<A>
被调用,您要么必须存储指针
到 A*
类型变量中的新对象,或者您需要将
C*
到 A*
.
在这种情况下,C
的虚函数在 A
和 B
中被覆盖,
可能会更好地达到目的。
#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;
}
输出: 我是什么 我是东西
目前我正在写一个程序,需要处理
继承类型和专用模板。在上面的示例中,我希望看到
我是一个
我是乙
尽管我处理的是基本 class 数组,但有没有办法正确调用与对象对应的函数?我不确定通过 dynamic_cast 进行类型检查和转换是否是最优雅的解决方案。请注意,这只是一个较大程序的摘录。
提前谢谢你
在主程序中,如下所示的三行创建了一个C*
的数组。
因此,该数组的任何元素都被视为 C*
而不管
元素的实际类型是什么。
也就是说,当你将 *array [0]
传递给函数 hi()
时,
被调用的函数是 hi(C)
解析为
通用 hi
函数,而不是任何一个专用函数。
C *array [] = {new A,new B};
hi (*array [0]);
hi (*array [1]);
为了使 hi<A>
被调用,您要么必须存储指针
到 A*
类型变量中的新对象,或者您需要将
C*
到 A*
.
在这种情况下,C
的虚函数在 A
和 B
中被覆盖,
可能会更好地达到目的。