关于C++:抽象基类难题

Abstract base class puzzle

在课堂设计中,我遇到了以下问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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由多个对象共享。但是,的实现依赖于模板参数。界面B是外界看到的,需要Abstrakt。

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

我希望我明白。有什么方法可以做到这一点,还是我需要重新考虑我的设计?


您有两条从Abstrackta继承的路径,您只在其中一条中实现Abstrakta::a(),因此编译器会抱怨。

在这两种情况下,您可能希望实际上从Abstrakta继承,以便只有一个Abstrakta基对象(在Abstrakta之前添加virtual)。


我忘了向基类添加虚拟析构函数。我相信这会导致运行时malloc错误。

1
2
3
4
AbstraktB *b = new ImplB;
b->A();
b->B();
delete b;

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

我通过将基类更改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
class AbstraktA
{
public:
    virtual ~AbstraktA(){};
    virtual void A() = 0;
};

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