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)。
步骤说明
- 定义基类
BaseWidget
并实现一个show
方法。 - 定义派生类
DerivedWidget
并重写show
方法。 - 在
main
函数中,创建一个DerivedWidget
对象,并用基类指针BaseWidget*
来引用它。 - 通过基类指针调用
show
方法,由于show
是虚函数,将调用派生类中的show
方法。 - 程序执行后,控制台将输出派生类中的信息,并且显示派生类的窗口。
总结
这个示例清楚地展示了在Qt中如何通过父类指针来调用子类的方法,即使这个方法不是虚函数。这是因为Qt中的
QWidget::show
方法是虚函数,所以当你通过父类指针调用它时,实际调用的是子类重写的版本。这就是为什么父类指针可以显示子类界面的原因。解决 无用评论 打赏 举报 编辑记录 - 基类名为
悬赏问题
- ¥15 mmo能不能做客户端怪物
- ¥15 osm下载到arcgis出错
- ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
- ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。
- ¥15 matlab如何根据图片中的公式绘制e和v的曲线图
- ¥15 我想用Python(Django)+Vue搭建一个用户登录界面,但是在运行npm run serve时报错了如何解决?
- ¥15 QQ邮箱过期怎么恢复?
- ¥15 登录他人的vue项目显示服务器错误
- ¥15 (标签-android|关键词-app)
- ¥15 comsol仿真压阻传感器