для определенного проекта я объявил интерфейс (класс только с чисто виртуальными функциями) и хочу предложить пользователям некоторые реализации этого интерфейса.
Я хочу, чтобы у пользователей была большая гибкость, поэтому я предлагаю частичные реализации этого интерфейса. В каждую реализацию включены некоторые функции, другие функции не переопределяются, поскольку они заботятся о разных частях.
Однако я также хочу представить пользователям полностью пригодную для использования реализацию интерфейса. Итак, мой первый подход состоял в том, чтобы просто получить класс из обеих частичных реализаций. Это не сработало и завершилось с ошибкой, что некоторые функции все еще являются чисто виртуальными в производном классе.
Итак, мой вопрос заключается в том, есть ли способ просто объединить две частичные реализации одного и того же интерфейса. Я нашел обходной путь, явно указав, какую функцию я хочу вызывать для каждого метода, но я считаю это довольно уродливым и был бы признателен за механизм, который позаботится об этом за меня.
#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();
}
С уважением, Александр
Настоящая проблема заключается в управлении несколькими посетителями дерева, позволяя каждому из них пройти по дереву, принять решение для каждого из узлов, а затем агрегировать решение каждого посетителя и собрать его в определенное решение.
Разделение обеих частей, к сожалению, невозможно без (я думаю) огромных накладных расходов, поскольку я хочу предоставить одну реализацию, отвечающую за управление посетителями, и другую, отвечающую за сохранение окончательного решения.
using
будет немного менее уродливым, чем то, что у вас есть, но оно не отвечает на ваш вопрос. - person Andrew Rasmussen   schedule 18.04.2011void foo(){foo();}
иvoid bar(){bar();}
- person aweinert   schedule 19.04.2011