你可以拥有与你继承的基类相同类的私有成员吗?

时间:2009-10-21 08:17:17

标签: c++ qt inheritance

我正在使用Qt库。我目前正在尝试创建自己的QDockWidget(MY类正在继承)。现在我的班级有一个到QDockWidget的ptr。这甚至有意义吗?这是一份法律声明吗?有没有更好的方法将QDockWidget与我在Qt中的其余程序分开?我对如何实现新的Dock Widget感到有点迷茫。这是MY QDockWidget类的副本:

#ifndef DOC_MENU_WIDGET_H #define DOC_MENU_WIDGET_H #include "App_interface.h" #include <QObject> #include <QWidget> #include <QDockWidget> class Doc_menu_widget : public QWidget { //Q_OBJECT public: Doc_menu_widget(App_interface *parent); ~Doc_menu_widget(); private: QDockWidget *dock_widget; }; #endif

4 个答案:

答案 0 :(得分:3)

您似乎混淆了IS-A关系和HAS-A关系。

IS-A关系是通过继承实现的。例如,QWidget IS-A QObject

HAS-A关系由成员实施。例如,QWidget HAS-A大小。

现在,您正在尝试开发的类和QDockWidget之间的关系是什么?这将告诉你应该选择哪两个。

答案 1 :(得分:1)

你不应该这样做吗?

class Doc_menu_widget : public QDockWidget
{
    // ...
};

QWidget进行子类化,然后拥有私有QDockWidget属性当然有意义,但它可能无法帮助您实现“自己的Dock小部件”(只要我理解正确) 。您只能以这种方式获取原始停靠窗口小部件,并且可以将其放置在新窗口小部件中的某个位置。

或者,如果您想从头开始实现等效的QDockWidget,则可能不需要私有QDockWidget

答案 2 :(得分:0)

当然,为什么不呢。如果你只是将ptr用于基类对象,那么你就没有了 完全没问题。

为什么不首先直接从QDockWidget派生?

你想表达:

  • (a)Doc_menu_widget IS-A QDockWidget - &GT;导出

  • (b)IS-IMPLEMENTED_IN_TERMS-OF QDockWidget(与PERFORMS-LIKE相同 QDockWidget) - &gt;使用私人会员

答案 3 :(得分:0)

如果您只需要为QDockWidget*创建QMainWindow,则大多数情况下您只需创建一个实例并立即使用它:

QDockWidget* dock = new QDockWidget(this);
dock->setWindowTitle("My Dock Widget");
addDockWidget(Qt::LeftDockWidgetArea, dock, Qt::Vertical);

如果您想要创建具有不同行为或外观的自定义QDockWidget,那么从QDockWidget继承可能更方便:

#include <QDockWidget>

class MyDockWidget : public QDockWidget
{
Q_OBJECT
    // ...
};

拥有一个拥有QDockWidget*私人成员的单独课程当然是完全可行且合法的,但在这种情况下,这不是最常见的选择。 原因是你很可能希望你的类是QDockWidget is-a 关系)的变体,这意味着它应该拥有所有公共方法,并且它的实例应该能够传递给询问QDockWidget个实例的方法(例如,您希望能够一个添加到QMainWindow)。