C++ 继承和隐藏不需要的继承函数

标签 c++ inheritance

我正在尝试实现 QToolBar子类,其项目由模型指定,而不是单独添加。这意味着选择添加/删除项目的功能(工具栏按钮),例如 addAction 不应公开访问。

从该对象继承的最佳方法是什么,但将选择的函数设为私有(private)?

我目前最好的想法是这样做:

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]

};

因此,将所有不应公开的功能重新定义为私有(private)。

这是个好主意,还是有更好的方法?

最佳答案

只要您从QToolBar 公开继承,您就可以让客户端代码像这样对待您的对象并调用例如addAction 成员函数。如果你想确保这些功能不可访问,你必须以另一种方式做到这一点:

  • QToolBar私有(private)继承
  • 公开公开您希望公开的函数(例如使用 using 声明)

如果您想坚持最初的解决方案并公开继承QToolbar:

  • 请注意,它不能保证不会调用基类函数
  • 您应该考虑使用 using 声明来更改基类函数的可访问性,而不是隐藏它们

关于C++ 继承和隐藏不需要的继承函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4484545/

相关文章:

c++ - 原始数组是否比 std::array 有任何优势?

c++ - C++ 中的前置/后置增量指针

java - 如何使用 JUnit5 测试抽象接口(interface)?

Javascript 简单原型(prototype)继承

javascript - 为什么在定义对象时不能在 (JavaScript) Worker 中使用它?

c++ - 为什么这个程序要交换值?

c++ - 使用模板 C++ 检查类型

c++ - 如何用 C++ 拟合二维散点数据

c# - 具有内部类对象的抽象类构造函数继承

javascript - 如何使用ES6类扩展Function?