我滴天呐我去 2024-07-24 21:36 采纳率: 60%
浏览 12
已结题

qt父类指针show子类界面

qt中,有一个父类继承了QWidget,又有一个子类继承了这个父类,并且在子类中完成了对界面的布局,现在以多态的形式给这个父类指针进行初始化,然后通过父类指针show出了子类对象,就这个地方让我有点想不明白的是为什么父类指针可以show出子类的界面,父类指针不是应该只能访问到子类那块数据中属于父类的那块嘛(虚函数除外).

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-07-24 21:36
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    在Qt中,多态性允许我们通过父类指针来调用子类中重写的方法。这是因为虚函数的存在,它们允许派生类提供特定实现,而父类指针在调用这些函数时会根据对象的实际类型来决定调用哪个版本的函数。

    完整案例

    以下是一个完整的示例,展示了如何使用父类指针来显示子类的界面:

    假设的数据

    • 基类名为 BaseWidget,继承自 QWidget
    • 派生类名为 DerivedWidget,继承自 BaseWidget
    • 基类有一个默认的 show 方法,输出 "Showing Base Widget"。
    • 派生类重写了 show 方法,输出 "Showing Derived Widget"。

    示例代码

    #include <QWidget>
    #include <QApplication>
    #include <iostream>
    
    class BaseWidget : public QWidget {
    public:
        BaseWidget(QWidget *parent = nullptr) : QWidget(parent) {
            setWindowTitle("Base Widget");
        }
    
        virtual ~BaseWidget() {}
    
        virtual void show() override {
            std::cout << "Showing Base Widget" << std::endl;
            QWidget::show();
        }
    };
    
    class DerivedWidget : public BaseWidget {
    public:
        DerivedWidget(QWidget *parent = nullptr) : BaseWidget(parent) {
            setWindowTitle("Derived Widget");
        }
    
        ~DerivedWidget() {}
    
        void show() override {
            std::cout << "Showing Derived Widget" << std::endl;
            QWidget::show();
        }
    };
    
    int main(int argc, char *argv[]) {
        QApplication app(argc, argv);
    
        // 基类指针指向派生类对象
        BaseWidget *basePtr = new DerivedWidget();
        
        // 通过基类指针调用show方法,实际执行的是派生类的show方法
        basePtr->show();
    
        delete basePtr;  // 释放内存
    
        return app.exec();
    }
    

    示例输入和输出

    • 输入: 运行上述代码。
    • 输出:
      • 控制台输出: "Showing Derived Widget"
      • 界面显示: 一个标题为 "Derived Widget" 的窗口。

    环境版本

    • Qt 5 或更高版本。
    • C++ 标准(至少C++11)。

    步骤说明

    1. 定义基类 BaseWidget 并实现一个 show 方法。
    2. 定义派生类 DerivedWidget 并重写 show 方法。
    3. main 函数中,创建一个 DerivedWidget 对象,并用基类指针 BaseWidget* 来引用它。
    4. 通过基类指针调用 show 方法,由于 show 是虚函数,将调用派生类中的 show 方法。
    5. 程序执行后,控制台将输出派生类中的信息,并且显示派生类的窗口。

    总结

    这个示例清楚地展示了在Qt中如何通过父类指针来调用子类的方法,即使这个方法不是虚函数。这是因为Qt中的 QWidget::show 方法是虚函数,所以当你通过父类指针调用它时,实际调用的是子类重写的版本。这就是为什么父类指针可以显示子类界面的原因。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月22日
  • 已采纳回答 10月14日
  • 创建了问题 7月24日