抽象基类拼图

Thi*_*man 2 c++ virtual templates abstract-class multiple-inheritance

在我的班级设计中遇到了以下问题:

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();
};
Run Code Online (Sandbox Code Playgroud)

上面代码的问题是编译器会抱怨AbstraktA :: A()没有定义.

接口A由多个对象共享.但是A的实现取决于模板参数.界面B是外界所看到的,需要abstrakt.

我想这样做的原因是它允许我像这样定义对象C:定义继承自abstrakt的接口C.使用模板A的不同数据类型定义C的实现.

我希望我很清楚.有没有办法做到这一点,还是我需要重新考虑我的设计?

APr*_*mer 9

你有两个AbstracktA继承路径,你只在其中一个中实现AbstraktA :: A(),所以编译器会抱怨.

您可能希望在两种情况下都从AbstraktA虚拟继承,因此只有一个AbstraktA基础对象(virtual在AbstraktA之前添加).