在我的类设计中,我遇到了以下问题:

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)。

09-04 15:39