在我的类设计中,我遇到了以下问题:
class MyData
{
int foo;
};
class AbstraktA
{
public:
virtual void A() = 0;
};
class AbstraktB : public AbstraktA
{
public:
virtual void B() = 0;
};
template<class T>
class ImplA : public AbstraktA
{
public:
void A(){ cout << "ImplA A()"; }
};
class ImplB : public ImplA<MyData>, public AbstraktB
{
public:
void B(){ cout << "ImplB B()"; }
};
void TestAbstrakt()
{
AbstraktB *b = (AbstraktB *) new ImplB;
b->A();
b->B();
};
上面的代码的问题在于,编译器将抱怨未定义AbstraktA::A()。
接口(interface)A由多个对象共享。但是A的实现取决于template参数。接口(interface)B是外界可见的,必须是抽象的。
我之所以这样想,是因为它允许我这样定义对象C:
定义从抽象A继承的接口(interface)C。
使用不同的数据类型为模板A定义C的实现。
我希望我清楚。有什么方法可以做到这一点,还是我需要重新考虑设计?
最佳答案
您有两条从AbstracktA继承的路径,仅在其中一条中实现AbstraktA::A(),因此编译器会抱怨。
在这两种情况下,您可能都希望实际上继承自AbstraktA,以便仅存在一个AbstraktA基础对象(在AbstraktA之前添加virtual
)。