C ++ наследование и скрытие нежелательных унаследованных функций - PullRequest
1 голос
/ 19 декабря 2010

Я пытаюсь реализовать подкласс QToolBar , в котором его элементы задаются моделью, а не добавляются по отдельности. Это означает, что выбор функций для добавления / удаления элементов (кнопок панели инструментов), таких как addAction, не должен быть общедоступным.

Каков лучший способ унаследовать от этого объекта, но сделать выбор функций закрытым?

Моя лучшая идея сейчас сделать так:

class ToolbarView : public QToolBar
{
    Q_OBJECT
public:
    explicit ToolbarView(QWidget *parent = 0);

signals:

public slots:

private:

    void addAction (QAction *action) {Q_UNUSED(action)};
    QAction* addAction (const QString &text) {return QToolBar::addAction(text) ;}
    ...
    QAction* addSeparator() {QToolBar::addSeparator();}
    ... [list of about 10 of these]

};

Итак, переопределяем все функции, которые не должны быть общедоступными, как частные.

Это хорошая идея или есть лучшие методы?

Ответы [ 3 ]

10 голосов
/ 19 декабря 2010

Пока вы публично наследуете от QToolBar, вы позволяете клиентскому коду обрабатывать ваш объект как таковой и вызывать, например, функцию-член addAction. Если вы хотите, чтобы эти функции были недоступны, вам придется сделать это другим способом:

  • Наследовать в частном порядке от QToolBar
  • Публичное представление функций, которые вы хотите предоставить (например, с помощью using объявлений)

Если вы хотите придерживаться своих первоначальных решений и публично наследовать от QToolbar:

  • Помните, что это не гарантирует, что функции базового класса не будут вызываться
  • Вы должны рассмотреть возможность использования объявлений using, чтобы изменить доступность функций базового класса, а не скрывать их
2 голосов
/ 19 декабря 2010

Может быть, вы могли бы подумать об этом

class ToolbarView : private QToolBar
{
    //...
}

В этом случае все доступные QToolBar будут иметь частный доступ в панели инструментов.

1 голос
/ 19 декабря 2010

Вы публично наследуете от QToolbar. Как насчет изменить это на private наследование. То есть определение класса должно начинаться с

    class ToolbarView : private QToolBar 
    {
    // good only if you want to 
    // make "most" of the public members of QToolBar private in ToolbarView
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...