【发布时间】:2019-04-06 02:13:55
【问题描述】:
我有一个基本接口,声明如下 - IBaseTest.h:
#pragma once
template <class T1>
class IBaseTest
{
public:
virtual ~IBaseTest();
virtual T1 DoSomething() = 0;
};
还有两个覆盖 DoSomething() CBaseTest1 类的孩子 - BaseTest1.h:
#pragma once
#include "IBaseTest.h"
class CBaseTest1: public IBaseTest<int>
{
public:
virtual int DoSomething();
};
BaseTest1.cpp:
#include "BaseTest1.h"
int CBaseTest1::DoSomething()
{
return -1;
}
和 CBaseTest2 在 - BaseTest2.h
#pragma once
#include "IBaseTest.h"
class CBaseTest2: public IBaseTest<long long>
{
public:
virtual long long DoSomething();
};
BaseTest2.cpp:
#include "BaseTest2.h"
long long CBaseTest2::DoSomething()
{
return -2;
}
所以 CBaseTest1::DoSomething() 将返回类型覆盖为 int,并将 CBaseTest2::DoSomething() 覆盖为 long long。现在,我想使用指向基接口的指针来处理这些类,但我遇到了问题:
#include "IBaseTest.h"
#include "BaseTest1.h"
#include "BaseTest2.h"
int _tmain(int argc, _TCHAR* argv[])
{
IBaseTest<T1> * pBase = NULL;
pBase = new CBaseTest1();
cout << pBase->DoSomething() << endl;
pBase = new CBaseTest2();
cout << pBase->DoSomething() << endl;
getchar();
return 0;
}
问题是我不能声明IBaseTest<T1> * pBase = NULL; T1 是未定义的。如果像这样在 _tmain 之前声明模板:
template <class T1>
int _tmain(int argc, _TCHAR* argv[])
{
...
}
我得到:error C2988: unrecognizable template declaration/definition
那么我在这里放什么而不是 T1?
IBaseTest<??> * pBase = NULL;
【问题讨论】:
-
CBaseTest1和CBaseTest2不共享一个共同的基本类型。没有一种通用类型可以让你的指针指向其中任何一个(void*除外)。 -
什么都没有。
IBaseTest<int>和IBaseTest<long long>是不同且完全不相关的类型。 -
好的,所以不可能这样做
-
你可以添加一个公共基础来多态地使用它们,尽管你想要不同的返回类型
CbaseTest1和CbaseTest2实际上几乎没有共同点 -
由于您尝试做的事情无法直接完成,因此您最好告诉我们您尝试解决的问题,因为他们可能存在比您尝试做的更好的选择.