我有一个在一个地方构造的模板化类层次结构,并将其传递到其他地方以对它们进行一些操作。
例如,可以将一个类模板化为某个复杂的对象,该对象知道如何将其自身转换为double型,并且该模板化的类具有将该对象输出为double型的操作。实用程序函数的一个示例是将此类的集合作为表输出的函数。
但是,我不想将这种类型作为模板化类进行传递,因为实用程序功能应该可以在任何具体的类变体上工作,因为它们都可以将自己表示为double。因此,我想使用一些非模板化的接口,该接口具有“以double表示”功能。为什么以下方法不起作用?
#include "stdafx.h"
class Interface1
{
public:
virtual int ReturnSomeInt();
};
template<typename myType>
class TClass1 : public Interface1
{
public:
int ReturnSomeInt() {return 5;}
void CalculateSomething(myType myValue) {}
TClass1() {}
};
//---------------------------------------------
class Interface2 : public Interface1
{
public:
virtual double ReturnSomeDouble();
};
template<typename myType>
class TClass2 : public TClass1<myType>, public Interface2
{
public:
double ReturnSomeDouble() {return 9.2;}
void CalculateSomethingElse(myType myValue) {}
TClass2() {}
};
//---------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
Interface2 myInterface = TClass2<float>();
int myInt = myInterface.ReturnSomeInt();
double myDouble = myInterface.ReturnSomeDouble();
return 0;
}
我收到一个链接错误2019,因为它找不到符号
Interface2::ReturnSomeDouble(void)
。可能是什么问题呢? 最佳答案
如果实例化该类型的对象或其子类型,则virtual
函数(此处为Interface2::ReturnSomeDouble()
)不能保持未实现。
因为,当实例化对象时,它需要用vptr
函数的地址/定义填充隐藏的类成员virtual
,这未找到,从而导致链接器错误。
您要么必须定义它们的主体,要么使其成为纯virtual
函数(这样定义就成为可选的)。
关于c++ - 非模板化类的接口(interface)c++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11185680/