2010-12-19 70 views
1

我试图实现一个QToolBar子类,其子项由模型指定,而不是单独添加。这意味着添加/删除项目(工具栏按钮)的功能选择(如addAction)不应公开访问。C++继承和隐藏不需要的继承函数

什么是从这个对象继承的最好方法,但选择的功能私人?

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

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] 

}; 

因此,重新定义,不应该是公共的所有功能,为私有。

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

回答

10

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

  • 继承私下从QToolBar
  • 公开暴露你想公开(例如用using声明)功能

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

  • 做个洁具,它并不能保证基类的功能不会被调用
  • 您应该考虑使用using声明改变的基类功能的辅助,而不是隐藏它们
+2

+1为唯一答案是完整的。 'private'继承*和''using'声明来公开非私有函数。 – rubenvb 2010-12-19 19:03:04

2

也许你会认为这

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

在这种情况下,所有可访问在QToolBar的将是与你ToolbarView私人通道。

1

您公开从QToolbar继承。如何将其改为private继承。那就是,班级定义应该以

class ToolbarView : private QToolBar 
    { 
    // good only if you want to 
    // make "most" of the public members of QToolBar private in ToolbarView 
    }