2016-07-09 1 views
0

Например, у меня есть базовый базовый класс A и B. A имеет виртуальный метод следующимДва сложенных полиморфизма странно, как сделать его расширяемым?

class A 
{ 
public: 
    virutal void f(B& b) = 0; 
}; 

Для класса А1

class A1 : public A 
{ 
public: 
    void f(B& b) override { b.f(A1); } 
}; 

и, таким образом для B, он нужен виртуальный метод f(A1)

class B 
{ 
public: 
    virtual void f(A1& a) = 0; 
}; 

И в class B1 : public B, виртуальный метод реализованы. Проблема в том, что когда добавляется еще один class A2 : public A, я должен добавить виртуальный метод virtual void f(A2& a) = 0 в классе B, который, как я думаю, разбивает код, потому что я не знаю, добавляется ли A2 даже A1 или нет, когда я проектирую класс B. Как избежать этого, но реализовать эквивалентные требования? Любая функция C++ может использоваться даже с шаблонами.

+0

Чего вы действительно хотите достичь? –

ответ

1

К сожалению, в C++ нет такой функции, как функция виртуального шаблона (это то, что, как я считаю, вы пытаетесь выполнить после анализа вашего вопроса).

Ближайший и наименее некрасиво решение, я могу думать, чтобы иметь виртуальную функцию в базовом классе B принять базовый класс A в качестве параметра:

class B 
{ 
public: 
    virtual void f(A& a) = 0; 
}; 

B1 переопределениях что, а затем использует dynamic_cast, чтобы передать свой параметр экземпляру A1.

Таким образом, вы можете продолжить определение пары производных классов Ax и Bx, не изменяя интерфейс API в базовом классе между двумя иерархиями.

Немного уродливый, но в вопросе говорится, что «любая функция C++ может быть использована», и dynamic_cast, безусловно, подпадает под это требование.