В моем проекте класса я столкнулся со следующей проблемой:
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.
Надеюсь, я в порядке. Есть ли способ сделать это, или мне нужно переосмыслить мой дизайн?