c++ 继承是否需要调用父类的构造函数

今天遇到一个继承的问题。请回答下面问题:(已知 B 继承自 A)

  • 子类是否需要调用父类的构造函数?必须还是可选?

先回答:

  • 结论1 :强烈建议显示调用父类构造。因为有些父类可能会初始化一些成员变量,子类又不知道他初始化了哪些变量。
  • 结论2:写父类的时候仅写一个构造函数。写一堆构造方法,别人写子类的时候调用哪个呢?

展示一些野生程序员的父类,让我写子类的时候一堆坑。

例子1: 父类有成员未定义,建议你显示调用父类构造。

别人的父类:
class A
{
public:A(int data = -1): value1(data) {}int value1; // 正确初始的成员变量char * value2;// 未初始化的成员变量,你一旦用了就报错int value3;// 未初始化的成员变量,但有默认值0。
};

这种情况下,如果你的子类不调用,就会报错,而且是你的过错。

你的子类
class B : A
{
public:不建议的构造B(int data) : name(data) {cout <<  *value2 << endl; // 报错,调用野指针}建议的构造B(int data) : A(data), name(data) {cout <<  *value2 << endl; // 也会报错,但责任不在你}	int name;
};

其实就是父类和子类各自管好各自的成员。

例子2 :父类的构造别定义一堆

有人喜欢这样定义父类:

 
class CRectangleData  
{
public:CRectangleData();CRectangleData(const double &dStartPosX, const double &dStartPosY, const double &dWidth, const double &dHeight);private:double m_dStartPosX;	//起点横坐标double m_dStartPosY;	//起点纵坐标double m_dWidth;		//宽度double m_dHeight;		//高度
};

不好:

  • 你有默认构造,子类就可以不用显示调用父类构造。我写子类的时候,到底调用你哪个父类构造呢?
  • 哪些参数是必须的?哪些参数是可以设置的?哪些参数是默认的?没有体现出来。容易造成必须参数的未定义。

实际案例

项目:绘图程序
需求:绘制各种形状

  • 父类:shape
  • 子类:三角形、圆形等

先定义一些非必要的东西。

enum class ShapeType
{Shape_Unknown		= 0,	//未知形状Shape_Rectangle		= 1,	//矩形Shape_Ellipse		= 2,	//椭圆Shape_Triangle		= 3,	//三角形
};

不好的写法:

  • 不好的1:父类、子类成员变量没有“初始化”,都是在构造函数中赋值;
  • 不好的2:子类构造中应该体现:必须设置变量、可设置变量和不可设置变量三种
父类
class CShapeData
{
public:CShapeData(){m_ShapeType = ShapeType::Shape_Unknown; }
protected:ShapeType	m_ShapeType;//形状类型
};子类椭圆形
class CEllipseData : public CShapeData
{
public:CEllipseData() // 不建议:无意义的定义{m_ShapeType		= ShapeType::Shape_Ellipse;m_dStartPosX	= 0.0;m_dStartPosY	= 0.0;m_dRadiusW		= 0.0;m_dRadiusH		= 0.0;}CEllipseData(const double &dStartPosX, const double &dStartPosY, const double &dRadiusW, const double &dRadiusH){m_ShapeType		= ShapeType::Shape_Ellipse;m_dStartPosX	= dStartPosX;m_dStartPosY	= dStartPosY;m_dRadiusW		= dRadiusW;m_dRadiusH		= dRadiusH;}private:double m_dStartPosX;	//起点横坐标double m_dStartPosY;	//起点纵坐标double m_dRadiusW;		//横向半径长度double m_dRadiusH;		//纵向半径长度
};

修改如下:

父类
class CShapeData
{
public:CShapeData(ShapeType shape):m_ShapeType(shape)  // 修改地方1 : a) 使用初始化列表 b) 必须设定 m_ShapeType 值{}
protected:ShapeType	m_ShapeType; 
};子类椭圆形
class CEllipseData : public CShapeData
{
public:// 修改地方2:a) 唯一的构造 b) 父类、子类各自初始化自己的变量CEllipseData(const double &dStartPosX, const double &dStartPosY, const double &dRadiusW, const double &dRadiusH) : CShapeData(ShapeType::Shape_Ellipse)m_dStartPosX	(dStartPosX),m_dStartPosY	(dStartPosY),m_dRadiusW   (dRadiusW),m_dRadiusH   (dRadiusH){}private:double m_dStartPosX;	//起点横坐标double m_dStartPosY;	//起点纵坐标double m_dRadiusW;		//横向半径长度double m_dRadiusH;		//纵向半径长度
};

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

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

相关文章

基于SpringBoot的洗衣店管理系统

基于SpringBoot的洗衣店管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 可视化展示 用户界面 管理员界面 摘要 洗衣店管理系统基于Spring Boot框…

c++对象拷贝与堆中的对象实例拷贝

文章目录 拷贝构造函数等于号运算符总结深拷贝堆中对象实例的拷贝错误的方法正确的拷贝方法使用多态技术拷贝实例拷贝构造函数 拷贝构造函数是C++中的一种特殊的构造函数,用于创建一个新对象,该对象是已存在的对象的副本。 拷贝构造函数的语法如下: class ClassName {// .…

IBM X3750 M4服务器主板故障全国协助处理

2023年12月31这天中午看到有位网络朋友加我&#xff0c;通过后该用户反馈说是有一台IBM System x3750 M4服务器有故障&#xff0c;现在无法开机。希望我们工程师协助他检测 分析 定位该故障问题原因和处理方案。 如上图所示&#xff1a;经过工程师与用户排查&#xff0c;发现该…

docker run命令

docker run命令 通过 docker run 命令创建一个新的容器。 Docker容器运行语法 docker run [OPTIONS] IMAGE [COMMAND] [ARG…] docker run常用选项 d, --detachfalse 指定容器运行于前台还是后台&#xff0c;默认为 false。 -i, --interactivefalse 打开 STDIN&#xff0c…

【linux】history命令显示时间的例子

在Linux中&#xff0c;你可以通过设置HISTTIMEFORMAT环境变量来显示命令的执行时间。这个环境变量定义了history命令中时间的显示格式。以下是设置和说明的步骤&#xff1a; 打开终端&#xff1a; 打开你的终端应用。 编辑配置文件&#xff1a; 使用文本编辑器&#xff08;如n…

SQL server 给列添加描述

添加列&#xff0c;列名为 sType。 use [DBName]; alter table [tbName] add sType int null default 0;添加新增列的描述&#xff1a; exec sys.sp_addextendedproperty name NMS_Description ,value 【该字段的描述】, level0typeNSCHEMA,level0nameNdbo, level1typeNTA…

pytorch学习笔记(七 )

池化类似压缩 最大池化-上采样 例如给一个3的话就会生成一个33的窗口&#xff08;生成相同的高和宽&#xff09;&#xff0c;给一个tuple就会给出一个相同的池化核。stride默认值就是核的大小 dilation 在卷积dialation设置之后每一个会和另外的差一个&#xff0c;空洞卷积 …

使用Pygame库来显示一个简单的窗口,并绘制一些基本的形状和文本

import pygame from pygame.locals import *# 初始化pygame库 pygame.init()# 创建窗口并设置大小和标题 screen_width 800 screen_height 600 screen pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("My Pygame")# 定义颜色…

vue通过下标修改数组里面内容,同时通过下标修改数组对象里面的内容,然后页面数组更新了。。。

vue通过下标修改数组里面内容&#xff0c;同时通过下标修改数组对象里面的内容&#xff0c;然后页面数组更新了&#xff1f;&#xff1f;&#xff1f; 项目里面一直都是知道vue通过下标修改数组里面内容是触发不了页面的更新的&#xff0c;需要用其他方式&#xff0c;当我写其…

给定n个字符串s[1...n], 求有多少个数对(i, j), 满足i < j 且 s[i] + s[j] == s[j] + s[i]?

题目 思路&#xff1a; 对于字符串a&#xff0c;b, (a.size() < b.size()), 考虑对字符串b满足什么条件&#xff1a; 由1、3可知a是b的前后缀&#xff0c;由2知b有一个周期是3&#xff0c;即a.size()&#xff0c;所以b是用多个a拼接而成的&#xff0c;有因为a是b的前后缀&…

“消费新纪元:从传统消费到消费增值的跨越!“

你是否已经厌倦了传统消费模式&#xff0c;感觉每一次购物只是让钱从左手流到右手&#xff1f;现在&#xff0c;一个新的消费模式正在兴起&#xff0c;它让你的消费变得更有价值&#xff01; 消费增值是一种创新的消费理念&#xff0c;它让你在享受优质商品和服务的同时&#x…

1.12 力扣中等图论

797. 所有可能的路径 - 力扣&#xff08;LeetCode&#xff09; 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09; graph[i] 是一个从节点 i 可以访问的所有节…

服务异步通讯——springcloud

服务异步通讯——springcloud 文章目录 服务异步通讯——springcloud初始MQRabbitMQ快速入门单机部署1.1.下载镜像安装MQ SpringAMQPwork Queue 工作队列Fanout Exchange广播模式DirectExchange路由模式TopicExchange话题模式 消息转换器 初始MQ RabbitMQ快速入门 官网https:/…

Unity网络通讯学习

---部分截图来自 siki学院Unity网络通讯课程 Socket 网络上的两个程序通过一个双向的通信连接实现数据交换&#xff0c;这个连接的一端称为一个 Socket &#xff0c;Socket 包含了网络通信必须的五种信息 Socket 例子{ 协议&#xff1a; TCP 本地&#xff1a; IP &#xff…

航天民芯一级代理-技术支持-一站式配单 MT9284-28J LED驱动芯片

描述 MT9284是一个升压转换器&#xff0c;设计用于从单电池锂离子电池中驱动多达7个系列的白色led。MT9284使用电流模式&#xff0c;固定频率结构来调节LED电流&#xff0c;它通过外部电流感应电阻来测量。MT9284包括低电压锁定、限流和热过载保护&#xff0c;以防止在输出过载…

ubuntu20.04 扩大交换空间swap

检查当前swap情况 free -msudo swapon --show关闭现有的swap sudo swapoff -a创建一个新的swap文件 sudo fallocate -l 32G /swapfile设定正确的权限 sudo chmod 600 /swapfile下面这个指令会把我们的空间变成可用的swap空间 sudo mkswap /swapfile启用swap文件 sudo swa…

Pandas实战100例 | 案例 8: 数据合并 - 使用 `concat`、`merge` 和 `join`

案例 8: 数据合并 - 使用 concat、merge 和 join 知识点讲解 在数据分析中&#xff0c;经常需要将不同的数据集合并在一起。Pandas 提供了 concat, merge, 和 join 几种方法来实现数据的合并。 concat: 用于沿一定轴向将多个对象堆叠在一起。可以用于简单的数据合并操作&…

python类装饰器编写单体类

1 python类装饰器编写单体类 类装饰器用于装饰类&#xff0c;用于管理类自身&#xff0c;或用于管理实例创建调用。 单体类&#xff0c;不管创建多少次实例&#xff0c;都只有一个实例的类。可以通过类装饰器管理装饰类的全部实例&#xff0c;实现单体类。 1.1 字典存放单体…

冠军团队!第二届百度搜索创新大赛AI方案

Datawhale干货 作者&#xff1a;李柯辰&#xff0c;Datawhale成员 写在前面 大家好&#xff0c;我们是2023年第二届百度搜索创新大赛 赛道三——AI应用设计赛道的冠军团队——“肝到凌晨”&#xff0c;很高兴能与大家分享我们这次比赛的经验&#xff0c;同时也希望以后有机会可…

50天精通Golang(第15天)

数据表的查询语句 用户对于数据表或视图等最常用的操作就是查询。也叫检索。通过select语句来实现 语法规则&#xff1a; select {columns}from {table|view|other select}[where 查询条件][group by 分组条件][having 分组后再限定][order by 排序]注意事项&#xff1a; sq…