для определенного проекта я объявил интерфейс (класс только с чисто виртуальными функциями) и хочу предложить пользователям несколько реализаций этого интерфейса.
Я хочу, чтобы пользователи обладали большой гибкостью, поэтому я предлагаю частичные реализации этого интерфейса. В каждую реализацию включена некоторая функциональность, другие функции не переопределяются, поскольку они заботятся о разных частях.
Однако я также хочу представить пользователям полностью удобную реализацию интерфейса. Поэтому мой первый подход состоял в том, чтобы просто извлечь класс из обеих частичных реализаций. Это не сработало и завершилось с ошибкой, что некоторые функции все еще являются чисто виртуальными в производном классе.
Так что мой вопрос, есть ли способ просто объединить две частичные реализации одного и того же интерфейса. Я нашел обходной путь, явно указав, какую функцию я хочу вызывать для каждого метода, но я считаю это довольно уродливым и был бы благодарен за механизм, который позаботится об этом для меня.
#include <iostream>
class A{
public:
virtual void foo() = 0;
virtual void bar() = 0;
};
class B: public A{
public:
void foo(){ std::cout << "Foo from B" << std::endl; }
};
class C: public A{
public:
void bar(){ std::cout << "Bar from C" << std::endl; }
};
// Does not work
class D: public B, public C {};
// Does work, but is ugly
class D: public B, public C {
public:
void foo(){ B::foo(); }
void bar(){ C::bar(); }
};
int main(int argc, char** argv){
D d;
d.foo();
d.bar();
}
С уважением,
Александр
Фактическая проблема состоит в том, чтобы управлять несколькими посетителями для дерева, позволяя каждому из них пройти по дереву, принять решение для каждого из узлов, а затем объединить решение каждого посетителя и накапливать его в определенное решение.
Разделение обеих частей, к сожалению, невозможно без (я думаю) огромных накладных расходов, так как я хочу предоставить одну реализацию, заботящуюся об управлении посетителями, и одну, заботящуюся о том, как сохранить окончательное решение.