理解Widget::Widget(QWidget *parent) :QWidget(parent)同C++ 基类和派生类的构造函数

news2024/10/6 6:04:28

1 QT中这段代码如何理解呢

 Widget::Widget(QWidget *parent) :
    QWidget(parent)
 {
 }

2 首先,来看一个例子

#include <iostream>
using namespace std;
class Base
{
public:
    Base() :m_num(0){    // 构造函数让类范围的m_num被初始化. 
        cout << "this is Base()" << endl;
    }
    Base(int val):m_num(val){
        cout << "this is Base(int val)" << endl;
    }
private:
    int m_num;
};

上方代码定义了一个基类Base,并且有两个构造函数,一个是默认构造函数,一个是有一个整型参数的构造函数。

class BaseChild: public Base
{
public:
    BaseChild(){
        cout << "this is BaseChild()" << endl;
    }
    BaseChild(int val): Base(val){
        cout << "this is BaseChild(val)" << endl;
    }
private:
    int m_num;
};

上方代码定义了一个BaseChild类,并继承Base类,同样的,它也定义了两个构造函数,一个默认,一个有整型参数。

int main(int argc, char *argv[])
{
    BaseChild child1;
    BaseChild child2(5);
 
    return 0;
}

main函数实例化了两个子类实例,child1,child2。child1调用默认构造函数。child2调用有整型参数的构造函数。

输出结果:

  • 创建child1时,是先调用了Base的默认构造函数,再调用自己的默认构造函数
  • 创建child2时,是先调用了Base(int)这个构造函数,再调用自己的整型参数构造函数。

 回头看BaseChild的构造函数

BaseChild(int val): Base(val){
        cout << "this is BaseChild(val)" << endl;
    }

初始化列表中的Base(val)正是调用了我们Base基类的有参构造函数,而这样的写法就刚好是我们开头代码中的那段

Widget::Widget(QWidget *parent) :QWidget(parent)

所以可以类比一下:Widget是调用了QWidget下面的构造函数 

3 总结为 C++ 基类和派生类的构造函数

  • 派生类不能继承基类的构造函数;
  • 派生类执行构造函数时,会调用基类的构造函数,一般来说,需要在派生类构造函数中指明基类构造函数,且必须在函数头指明,例如:
#include<iostream>
using namespace std;

//基类People
class People{
protected:
    char *m_name;
    int m_age;
public:
    People(char*, int);
};
People::People(char *name, int age): m_name(name), m_age(age){}

//派生类Student
class Student: public People{
private:
    float m_score;
public:
    Student(char *name, int age, float score);
    void display();
};
//People(name, age)就是调用基类的构造函数
Student::Student(char *name, int age, float score): People(name, age), m_score(score){ }
void Student::display(){
    cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<"。"<<endl;
}

int main(){
    Student stu("小明", 16, 90.5);
    stu.display();

    return 0;
}
  • 如果不指明,派生类的构造函数就会调用基类的默认构造函数(不带参数的构造函数),此时,如果基类没有默认构造函数(不带参数的构造函数),就会发生编译错误。
#include <iostream>
using namespace std;

//基类People
class People{
public:
    People();  //基类默认构造函数, 如果将该行删除,执行派生类构造函数Student::Student(): m_score(0.0){ }时,会发生编译错误
    People(char *name, int age);
protected:
    char *m_name;
    int m_age;
};
People::People(): m_name("xxx"), m_age(0){ }
People::People(char *name, int age): m_name(name), m_age(age){}

//派生类Student
class Student: public People{
public:
    Student();
    Student(char*, int, float);
public:
    void display();
private:
    float m_score;
};
Student::Student(): m_score(0.0){ }  //派生类默认构造函数
Student::Student(char *name, int age, float score): People(name, age), m_score(score){ }
void Student::display(){
    cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<"。"<<endl;
}

int main(){
    Student stu1;
    stu1.display();

    Student stu2("小明", 16, 90.5);
    stu2.display();

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/666168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

平衡小车学习教程1——硬件资源及其小车底层硬件介绍篇

起因 大家在学会了Stm32后&#xff0c;可以做一个项目来进行来进行练手&#xff0c;平衡小车就是一个很好的练手项目&#xff0c;可以检验自己的学习成果&#xff0c;也可以对学习到的知识进行一个复习。再一个就是通过做项目来锻炼自己的工程能力。 好啦&#xff0c;废话不多…

2023 亚马逊云科技中国峰会,引领 Serverless 技术架构新潮流

序言 随着大数据与云计算技术的深入发展&#xff0c;Serverless 已经成为一个技术趋势&#xff0c;一个云的重要发展方向。依托于 Serverless 无服务器架构&#xff0c;云上技术方式正在由过去的集中式、分布式研发&#xff0c;向新式云上组装式研发转变&#xff0c;实现软件研…

医学影像临床信息系统PACS源码

医学影像临床信息系统&#xff08;Picture Archiving and Communication Systems&#xff09;PACS是指从医疗影像设备中获得数字影像&#xff0c;利用高速网络进行存储、管理、传输的医疗影像信息管理系统。通过该系统&#xff0c;能实现影像数字化、无胶片化管理。 登记系统 …

【linux系统编程学习】【未完待续】

牛客网webserver教程 1. linux系统编程入门1.1 Linux开发环境搭建1.2 GCC&#xff08;1&#xff09; 1. linux系统编程入门 1.1 Linux开发环境搭建 安装虚拟机安装VMware tool 解压-提取文件-然后对应文件夹中 sudo ./vmware-install.pl安装openssh-server sudo apt instal…

【后端面经-Java】Java创建线程的方法简介

【后端面经-Java】Java创建线程的方法简介 1. 线程的基本概念1.1 线程1.2 线程状态和生命周期 2. 创建线程的四种方法2.1 继承Thread类2.2 实现Runnable接口2.3 实现Callable接口2.4 使用线程池 3. 参考资料 1. 线程的基本概念 1.1 线程 学过操作系统的同学应该不陌生&#x…

如何使用 SpringFox 自动生成 RESTful API 文档?

如何使用 SpringFox 自动生成 RESTful API 文档&#xff1f; 在开发 RESTful API 时&#xff0c;编写 API 文档是一个重要的任务。API 文档可以帮助其他开发人员了解 API 的用法、参数、返回值等信息。然而&#xff0c;手动编写 API 文档是一项繁琐的工作&#xff0c;往往需要…

苹果Vision Pro生态升级,UWB芯片制程规格将提高

苹果将积极升级硬件产品规格以建构更有竞争力的 Vision Pro 生态&#xff0c;UWB芯片制程规格将提高。 郭明錤称&#xff0c;Vision Pro 的成功关键之一在于生态&#xff0c;当中包括能否与其他苹果硬件产品整合&#xff0c;而与此相关的主要硬件规格为 Wi-Fi 与 UWB。iPhone…

静态NAT和动态NAT实验

静态NAT 拓扑 需求 实现企业内网主机&#xff08;PC1/PC2&#xff09;访问公网网站服务器&#xff08;Server1&#xff09; 配置步骤 第一步&#xff1a;给PC1/PC2/Server1配置接口IP地址&#xff0c;掩码&#xff0c;网关 第二步&#xff1a;R1配置路由和静态NAT -边界路由器…

燕之屋转战港股IPO,3年广告宣传费超8亿,研发费不足1亿

港股“燕窝第一股”又来了&#xff1f; 6月12日&#xff0c;厦门燕之屋生物工程股份有限公司&#xff08;下称“燕之屋”&#xff09;在A股上市未果后&#xff0c;转战港股IPO。 这已经是燕之屋第三次向港交所递交招股书。2011年和2021年其两次向港交所递交招股书&#xff0c…

手机丢失自救手册:48 小时内你能做哪些挣扎?

48小时后&#xff0c;我终于解除了丢失模式 5 月 16 日 19:30&#xff0c;我的苹果手机遗落在深圳某网约车上。当晚&#xff0c;在与司机协商无果、报警无果、定位丢失的前提下&#xff0c;我放弃了寻找。5 月 17 日下午 16:00&#xff0c;手机定位更新&#xff0c;重燃希望的我…

Python换脸——如何让马老师打篮球

文章目录 数据准备提取特征三角剖分仿射变换无缝克隆 简单的换脸只需要四步 提取脸部特征点三角剖分仿射变换无缝克隆 数据准备 想完成这个&#xff0c;opencv足以胜任&#xff0c;首先第一步&#xff0c;自然是打开准备换脸的图像 import matplotlib.pyplot as plt import…

回溯算法-leetcode78 子集(java)

子集 leetcode78 子集题目描述 子集问题的解题思路代码框架子集解题代码 动态规划专题 leetcode78 子集 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/subsets 题目描述 给你一个整数数组 nums &#xff0c;数组中的元…

IS220PPDAH1B 336A5026ADP14 GE Speedtronic MKVIe 燃气轮机控制

IS220PPDAH1B 336A5026ADP14 GE Speedtronic MKVIe 燃气轮机控制 IS220PPDAH1B 336A5026ADP14 GE Speedtronic MKVIe 燃气轮机控制 电机控制二次回路功能说明&#xff1a;电气柜、现场操作箱上的停止按钮能在任何状态下让电机停止运行&#xff1b;控制地点选择开关可以选择“本…

在?聊聊浏览器事件循环机制

目录 前言 同步/异步编程模型 同步 异步 JS异步模型 调用栈 任务队列 宏任务队列 微任务队列 微任务API 事件循环 队列优先级 混合队列 事件循环实现 总结 参考文章 Event-Loop可视化工具 前言 JS是单线程语言&#xff0c;在某个时间段只能执行一段代码。这…

tailwindcss 多上下文与独立分包

tailwindcss 多上下文与独立分包 你看过动漫《百兽王》吗&#xff1f;《百兽王》的主人公是五个飞行员&#xff0c;他们分别驾驶黑、红、青、黄、绿五头机器狮&#xff0c;它们平时可以单独进行作战&#xff0c;遇到强敌时&#xff0c;也能进行五狮合体&#xff0c;成为巨大机…

论文写作全攻略

【基于Citespace和vosviewer文献计量学相关论文 】 文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量化的综合性知识体系。特别是&#xff0c;信息可视化技术手段和方法的运用&#xff0…

uniapp写出文本域,右下角并限制字数200

<view class"textarea_box"><textarea class"textarea" placeholder"请填写10字以上的问题描述&#xff0c;以便我们更好的帮助您解决问题&#xff0c;提高产品质量。" placeholder-style"font-size:28rpx" maxlength"2…

图片怎么压缩到200K以内?来试试这几种压缩方法

怎么把图片压缩到200K以内呢&#xff1f;在日常生活中&#xff0c;不管是工作还是出门游玩&#xff0c;都会使用图片&#xff0c;当这些图片的内存太大时&#xff0c;保存和发送会成为一种难题&#xff0c;有的网站甚至无法上传超过一定内存的照片&#xff0c;那么我们怎么给照…

组态王与FX5u之间EtherNet/IP无线以太网通信

在实际系统中&#xff0c;同一个车间里分布多台PLC&#xff0c;通过上位机集中控制。通常所有设备距离在几十米到上百米不等。在有通讯需求的时候&#xff0c;如果布线的话&#xff0c;工程量较大耽误工期&#xff0c;这种情况下比较适合采用无线通信方式。 本方案以组态王和2…