抽象基类拼图

时间:2010-03-16 10:01:01

标签: c++ templates virtual 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();
};

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

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

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

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

2 个答案:

答案 0 :(得分:9)

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

你可能想要在两种情况下从AbstraktA虚拟继承,这样只有一个AbstraktA基础对象(在AbstraktA之前添加virtual)。

答案 1 :(得分:0)

我忘了在基类中添加虚拟析构函数。这导致了我认为的运行时malloc错误。

AbstraktB *b = new ImplB;
b->A();
b->B();
delete b;

在调试模式下,在delete语句中,GCC给了我: malloc:***对象0x60e2c4的错误:释放的指针未分配

我通过将基类更改为:

来解决这个问题
class AbstraktA
{
public:
    virtual ~AbstraktA(){};
    virtual void A() = 0;
};

class AbstraktB : virtual public AbstraktA
{
public:
    virtual ~AbstraktB(){};
    virtual void B() = 0;
};