QT:私有成员而不是继承?是什么原因?这是一个具体的概念吗?

QT: Private member instead of inheritance? What is the reason? Is this a specific concept?

前段时间我用 QT Designer / QT Creator 编写了一个 GUI。 对于这个问题,我将首先说明使用上述 IDE 创建 GUI 的一般过程如何工作的示意图:

  1. 使用 QT Designer 创建设计 -> 获取 .ui 个文件
  2. .ui 文件被翻译成头文件,你特别得到类似 "UIbasisclass.h" (with class UIbasisclass) .
  3. 你创建了一个类似 "UIsubclass.h" 的东西(有 class UIsubclass)你自己创建了一个私有成员 UIbasisclass ui.

class内的代码UIsubclass:

...
        private:

       Ui::UIbasisclass ui;
...

最后你会在main方法中创建一个UIsubclass的对象 -> 代码:

...
    UIsubclass *MyGUI = new UIsubclass();
...

其中 UIsubclass 的构造函数包含以下代码:

...
    ui.setupUi(this); 
...

简而言之:我们有一个主要负责应用方法的UIsubclass,还有一个名为ui 的私有成员UIbasisclass,主要由设计代码组成。 当我们创建一个 UIsubclass 的对象时,它的私有成员 UIbasisclass uiUIsubclass 的构造函数中用 UIsubclass 本身的对象初始化(?)。 [参见:这个指针]

我现在的问题是:

  1. 为什么没有像UIsubclass继承自UIbasisclass那样使用继承?相反,UIbasisclass 的一个对象成为 UIsubclass.

  2. 的成员
  3. 这是一些特定的有利概念(如果是,它有哪些优点或它是如何命名的?)还是"just"QT代码结构的必要性?

如果我必须说明我的问题或有任何问题,请告诉我。

您可以使用私有继承,它甚至在 Qt documentation 中有记载。

ui默认使用私有成员,因为Qt Creator使用的模板,Qt本身并不关心。

Why isn't there used inheritance in the way that UIsubclass inherits from UIbasisclass?

您是在问我们为什么不在自己的代码中这样做?去做就对了。由你决定。它确实是 您的 代码。 负责其设计。如果您使用的是模板,它可以帮助您入门,但不能为您设计软件。责任在你,也只在你。

it "just" a necessity of the QT code structure?

没有这个必要。 Ui class 是一个 POD class,带有一堆指针和一个方法。没什么大不了的。如果你想从它私有继承:继续。

因为使用私有成员,您可以转发声明生成的 class:

namespace Ui {
    class MyForm;
}

class Foo {
private:
    Ui::MyForm *ui;    
};

然后在 .cpp 文件中插入包含。

这样,此文件的所有可能包含都不必再次预处理该文件。