Абстрактная головоломка базового класса - PullRequest
2 голосов
/ 16 марта 2010

В моем проекте класса я столкнулся со следующей проблемой:

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 виден внешним миром и должен быть абстрактным.

Причина, по которой я хотел бы это, состоит в том, что это позволило бы мне определить объект C следующим образом: Определите интерфейс C, наследующий от абстрактного A. Определите реализацию C, используя другой тип данных для шаблона A.

Надеюсь, я в порядке. Есть ли способ сделать это, или мне нужно переосмыслить мой дизайн?

Ответы [ 2 ]

9 голосов
/ 16 марта 2010

У вас есть два пути наследования от AbstracktA, вы реализуете AbstraktA :: A () только в одном из них, поэтому компилятор жалуется.

В обоих случаях вы, вероятно, хотите наследовать виртуально от AbstraktA, чтобы был только один базовый объект AbstraktA (добавьте virtual перед AbstraktA).

0 голосов
/ 17 марта 2010

Я забыл добавить виртуальные деструкторы в базовые классы. Я считаю, что это приводит к ошибкам malloc во время выполнения.

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

В режиме отладки в операторе удаления GCC дает мне: malloc: *** ошибка для объекта 0x60e2c4: освобожденный указатель не выделен

Я решил это, изменив базовые классы на:

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

class AbstraktB : virtual public AbstraktA
{
public:
    virtual ~AbstraktB(){};
    virtual void B() = 0;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...