Можно ли это сделать с множественным наследованием? - PullRequest
0 голосов
/ 12 февраля 2011

Вот что я хотел бы сделать.

Скажи, что у меня есть виджет класса.

Затем я создаю кнопку из виджета.

Затем я создаю ModifiedWidget, который повторно реализует определенные функции Widget.

Затем я хочу, чтобы Button использовал ModifiedWidget, а не обычный Widget. Можно ли это как-то сделать?

Спасибо

class Button : public Widget;

class SuperButton : public Button, public ModifiedWidget;

Я просто не уверен, что это сделает то, что я хочу, хотя.

Ответы [ 3 ]

3 голосов
/ 12 февраля 2011

Самый простой способ - использовать инкапсуляцию, а не наследование.

class Button
{
    Button(Widget * w) { mywidget = w; }
    Widget * mywidget;
};

Другой способ - позволить Button быть классом шаблона.

template<class Parent>
class Button : Parent
{
};

Button<Widget> mybutton1;
Button<ModifiedWidget> mybutton2;
0 голосов
/ 12 февраля 2011

Держите их отдельно:

class Widget {
    ...
    virtual void some_function();
};

class ModifiedWidget : public Widget {
    ...
    // override the base version of this method
    virtual void some_function();
};

class Button {
    Button(Widget* w) : widge(w) { }
    Widget* widge;
};

class SuperButton : public virtual Button {
    SuperButton(Widget* w) : Button(w) { }
};

Теперь ваши Widget имеют иерархию, а ваши Button имеют свою собственную иерархию.И, вероятно, имеет смысл сказать, что ваша кнопка содержит виджет, чем сказать, что ваша кнопка является виджетом.Таким образом, мы используем инкапсуляцию вместо наследования для отношения Button-Widget, но по-прежнему имеем наследование для кнопок и виджетов отдельно.

0 голосов
/ 12 февраля 2011

Если я понял ваш вопрос, это типичная проблема Dreaded Diamond

С некоторой осторожностью это возможно, хотя я предлагаю пересмотреть ваш дизайн, поскольку часто можно избежать множественного наследования(что обеспечивает более простой и чистый дизайн).

Также Прочитайте C ++ Faq на Dreaded Diamond

В ответ на ваш пример вам придется использовать виртуальное наследование для Button иМодифицированные виджеты классов.

class Button : public virtual Widget;

class ModifiedWidget : public virtual Widget;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...