Я получил эти виртуальные классы из библиотеки, которая реализует алгоритм в виде абстрактных классов
class A{
public :
virtual void foo() = 0 ;
};
class B{
public:
void setA(A * a) { m_a = a ;}
virtual void f() = 0;
void g() {m_a->foo();}
protected:
A * m_a ;
};
Чтобы использовать библиотеку, вам просто нужно извлечь классы и реализовать чисто виртуальные функции, такие как foo()
, и предоставить другие методы, специфичные для реализации (bar()
).
class dA : public A {
public :
void foo() {/* ... */}
void bar() {/* ... */}
};
class dB : public B {
public :
void f() ;
};
Обычно я использую этот класс, вызывая
dB * mydB = new dB() ;
mydB->setA(new dA() );
mydB->f() ;
mydB->g() ;
Но у меня проблема с дизайном при реализации dB::f()
, потому что мне нужно вызвать dA::bar()
, что характерно для dB
. Но в классе я держу ссылку только на дБ через B *. Тогда я подумал о двух вариантах:
- используйте
dynamic_cast
каждый раз, когда f()
вызывается для приведения B::m_a
в dB*
- добавить член m_dA в дБ, который хранит тот же указатель, что и m_a, но может использоваться для доступа к определенным функциям в дБ.
Конечно, я не могу изменить базовые классы.
Я хотел бы знать, есть ли более элегантное решение этой проблемы (например, шаблон проектирования, о котором я не думал). Если нет, какой мне выбрать?