C++子类继承父类时如何写构造函数

先摘一段别人的:

构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。
如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建。
构造原则如下:
1,如果子类没有定义构造方法,则调用父类的无参数的构造方法。
2,在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类自己提供了无参构造函数,则会调用父类自己的无参构造函数。
3,在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数,则会出错(如果父类只有有参数的构造方法,则子类必须显示调用此带参构造方法)。
4,如果子类调用父类带参数的构造方法,需要用初始化父类成员对象的方式。
————————————————
版权声明:本文为CSDN博主「低头走路,抬头看天」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/rusbme/article/details/97932414

先放结论:以上原则,都是对的,但也可以违背。本文先顺着这些原则举例,

我的部分:

以上原则比较抽象,自己动手写写才能体会。在PUBG中,Scar属于AR(自动步枪)的一种,此为案例代码背景。

一,构造原则1:

如果子类没有定义构造方法,则调用父类的无参数的构造方法。

#include <iostream>
using namespace std;
class ar 
{
public:				//不写public会报无法访问private的错误ar() 			//父类有无参数构造方法{cout << "来了支自动步枪" << endl;}
};
class scar :public ar
{				    //子类没有定义构造方法
};
int main()
{ar Alice;scar Bob;return 0;
}

运行结果为:

来了支自动步枪
来了支自动步枪

可见父类的无参数构造函数在创建子类时被调用了。
需要注意的是,如果在实例后加了圆括号:

ar Alice();
scar Bob();

则运行结果为空,但是也不报错

二,构造原则2:

在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类自己提供了无参构造函数,则会调用父类自己的无参构造函数。

#include <iostream>
using namespace std;
class ar
{
public:ar()						//父类有无参数构造方法{cout << "来了支自动步枪" << endl;}
};
class scar :public ar
{
public:				scar()					   //子类有无参数构造方法{cout << "来了把Scar" << endl;}
};
int main()
{ar Alice;scar Bob;return 0;
}

运行结果为:

来了支自动步枪
来了支自动步枪
来了把Scar

可见,虽然子类定义了构造函数,但是在创建子类时,仍然会调用父类的构造函数。

三,构造原则3:

在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数,则会出错(如果父类只有有参数的构造方法,则子类必须显示调用此带参构造方法)。

#include <iostream>
using namespace std;
class ar
{
public:ar(int dmg)				//父类有带参数的构造方法{cout << "来了支自动步枪,单发伤害为"<<dmg << endl;}
};
class scar :public ar
{
public:				scar()				    //子类还是无参数的构造方法{cout << "来了把Scar" << endl;}
};
int main()
{ar Alice(45);scar Bob;return 0;
}

运行报错:
这里的报错指的是子类里的ar在这里插入图片描述
到这儿基本明白了,无论子类的构造函数是啥样,创建子类必定调用父类的构造函数。所以父类的构造函数需要参数,子类却没法给,就得报错了。

如果这样写行不行呢:↓

class scar :public ar
{
public:				scar(int dmg)				    //子类的构造方法带了参数,但没显式调用父类的构造方法{cout << "来了把Scar" << endl;}
};

依然是报错。
如果子类没有构造方法呢?还是报错。

正确写法是:

#include <iostream>
using namespace std;
class ar
{
public:ar(int dmg)							//父类有带参数的构造方法{cout << "来了支自动步枪,单发伤害为"<<dmg << endl;}
};
class scar :public ar
{
public:				scar(int dmg):ar(dmg)				//子类构造方法带了参数,且显式调用父类的构造方法{cout << "来了把Scar,单发伤害是"<<dmg << endl;}
};
int main()
{ar Alice(45);scar Bob(42);return 0;
}

运行结果为:

来了支自动步枪,单发伤害为45
来了支自动步枪,单发伤害为42			//注意这里是42而不是45哦
来了把Scar,单发伤害是42

四,构造原则4:

如果子类调用父类带参数的构造方法,需要用初始化父类成员对象的方式。

#include <iostream>
using namespace std;
class ar
{
public:ar(int dmg)							//父类有带参数的构造方法{cout << "来了支自动步枪,单发伤害为"<<dmg << endl;}
};
class scar :public ar
{
public:				scar(int dmg):ar(dmg)				//子类构造方法带参数,且显式调用父类的构造方法{cout << "来了把Scar,单发伤害是"<<dmg << endl;ar(61);							//子类调用父类带参数的构造方法,需要用初始化父类成员对象的方式,且只能在这里调用}
};
int main()
{ar Alice(45);scar Bob(42);return 0;
}

运行结果:

来了支自动步枪,单发伤害为45
来了支自动步枪,单发伤害为42
来了把Scar,单发伤害是42
来了支自动步枪,单发伤害为61

需要注意的,ar(61);这个调用只能写在子类的构造函数定义中。
BTW,什么自动步枪的单发伤害能有61?当然是MK14-EBR。

五,反转来了

上面几个例子看下来,似乎有了这么个表:

父类构造函数的参数数量子类构造函数的参数数量要求
没要求
N(N>0)≥N且包含父类的所有构造函数参数

真的是这样吗?
其实还有这么个骚操作:

#include <iostream>
using namespace std;
class ar
{
public:ar(int dmg, int bullet)					    //父类有带2个参数的构造方法{cout << "来了支自动步枪,单发伤害为" << dmg;cout<<",一个弹匣有"<<bullet<<"发子弹"<< endl;}
};
class scar :public ar
{
public:scar(int dmg);							    //声明子类的构造方法,它只带1个参数,可以吗?
};
scar::scar(int dmg) :ar(dmg, 30)				//定义子类构造方法,调用父类的构造方法时把另一个参数赋值
{cout << "来了把Scar,单发伤害是" << dmg << endl;
}
int main()
{ar Alice(61, 20);scar Bob(42);return 0;

运行结果为:

来了支自动步枪,单发伤害为61,一个弹匣有20发子弹
来了支自动步枪,单发伤害为42,一个弹匣有30发子弹
来了把Scar,单发伤害是42

可见,在为了构建子类的构造函数而调用父类的构造函数时,给父类里那些子类不用的参数赋个值就OK了。
所以哪怕父类的构造函数有100000个参数,子类的构造函数其实依然可以是无参数的。

六,搞复杂点

子类可以直接调用父类的成员属性。
子类定义构造函数时,还可以给自己的成员变量赋默认值:

#include <iostream>
using namespace std;
class ar
{
public:ar(int dmg,int bullet)					    //父类有带2个参数的构造方法{cout << "来了支自动步枪,单发伤害为"<<dmg << endl;}int v0=880;									//父类设一个成员属性“子弹初速”
};
class scar :public ar
{
public:				scar(int dmg);							    //声明子类的构造方法,它只带1个参数哦,可以吗?float caliber;								//子类设置个成员属性“口径”
};
scar::scar(int dmg) :ar(dmg, 30)				//定义子类构造方法,显式调用父类的构造方法,没用的父类构造参数给了个值“30”
,caliber(5.56)									//在这儿可以设置子类的成员属性的默认值。
{cout << "来了把Scar,单发伤害是" << dmg <<",";cout << "口径是" << caliber <<"mm"<< endl;
}
int main()
{ar Alice(61,20);scar Bob(42,30);Bob.v0 = 870;								//修改子类从父类继承的“子弹初速”属性cout << "Bob手里的枪子弹初速为" << Bob.v0 << "m/s" << endl;return 0;
}

运行结果为:

来了支自动步枪,单发伤害为61
来了支自动步枪,单发伤害为42
来了把Scar,单发伤害是42,口径是5.56mm
Bob手里的枪子弹初速为870m/s

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

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

相关文章

如何将亚马逊Seller Central 用到极致~

不论是新手卖家还是有经验的老手&#xff0c;亚马逊卖家中心都是一个可以帮助卖家发展业务的好工具&#xff0c;对于许多新手小白来说&#xff0c;亚马逊这样巨大的平台仍有许多功能与服务等着挖掘。 什么是亚马逊卖家中心&#xff1f; 亚马逊卖家中心是第三方卖家用来管理和…

虾皮、Lazada怎么选爆款?测评有哪些方法?

对于一个店铺来说&#xff0c;想要让自己店铺获得更多的流量推广&#xff0c;那么打造出爆款是非常重要的&#xff0c;虾皮、Lazada作为跨境平台也是同样如此&#xff0c;下面就来介绍虾皮、Lazada怎么去选爆款? 1、跟卖 以Shopee、Lazada平台选品&#xff0c;直接“抄”同行…

亚马逊站内流量太少,如何拓展流量渠道增加产品销量?

近两年&#xff0c;经历了行业大洗牌之后&#xff0c;由于入驻平台卖家逐日增多&#xff0c;站内广告成本越来越高&#xff0c;想要抢占更多的站内流量变得愈发困难&#xff0c;一天出不了几单的情况也随处可见。因此&#xff0c;当站内流量的获取遭遇瓶颈&#xff0c;卖家想要…

AIGC技术与应用全解析

一、简介 近期&#xff0c;短视频平台上火爆的“AI绘画”&#xff0c;在各大科技平台上刷屏的智能聊天软件ChatGPT&#xff0c;引起了人们广泛关注。人工智能潜力再次被证明&#xff0c;而这两个概念均来自同一个领域&#xff1a;AIGC。AIGC到底是什么&#xff1f;为什么如此引…

音视频技术开发周刊 | 281

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 ChatGPT背后的经济账 ChatGPT能否取代Google、百度这样的传统搜索引擎&#xff1f;为什么中国不能很快做出ChatGPT&#xff1f;当前&#xff0c;对这些问题的探讨大多囿于…

一周 AIGC 丨谷歌正面反击 GPT-4,Claude 一分钟看完万字长文,Stability AI 发布文生动画工具...

AIGC 再进化&#xff0c;谷歌在 2023 年 I/O 开发者大会上宣布面向所有用户开放 MusicLM 模型&#xff0c;输入文字描述即可生成音乐。GPT4 最强对手 Anthropic Claude 史诗升级&#xff0c;百页资料一分钟总结完毕。Stability AI 推出文本到动画工具 Stable Animation SDK&…

ChatGPT+Midjourney可量产“宫崎骏”,AI将会让多少设计师失业?

最近&#xff0c;大家都被横空出世的ChatGPT惊艳到了。 瞬间在全世界爆红的ChatGPT&#xff0c;除了陪聊&#xff0c;它还能写论文、写小说、写代码、编剧本……几乎无所不能。 ChatGPT让科技巨头谷歌发出了红色警报&#xff0c;一夜之间全世界的打工人们也都慌了——我们的很…

香港top5功能完善炒期货投资app软件排名(最新评测)

选择一款合适的炒期货投资软件对于投资者来说至关重要。考虑软件稳定、交易流畅度、交易品种、数据可靠性、而且还要考虑费用等多方面因素。 首先&#xff0c;软件的稳定性很重要。选用稳定性高的软件可以避免如断电、手机或电脑死机等突发状况&#xff0c;保证交易安全顺畅。…

量化交易软件哪家好?国内排名是?

一、量化交易软件是什么 量化交易软件是一种基于计算机程序和算法的交易系统&#xff0c;能够自动化地执行投资策略&#xff0c;降低交易成本、提高交易效率。它通过数据分析、技术分析等手段&#xff0c;对市场走势进行预测&#xff0c;并根据预测结果自动执行交易&#xff0…

贵金属实时行情看盘软件排行榜(top 10)

贵金属实时行情看盘软件哪个好&#xff0c;还是得看MT4软件&#xff0c;MT4是俄罗斯软件公司MetaQuotes生产的一款以外汇和贵金属交易为主的软件&#xff0c;其功能十分全面&#xff0c;目前全球有超过100家贵金属公司和30个国家的银行选择MT4软件作为网络交易平台。MT4综合行情…

重磅!ChatGPT席卷全球,Salesforce将推出EinsteinGPT!

2月9日&#xff0c;Salesforce首席执行官Marc Benioff在Twitter上发布了这样一则推文&#xff0c;表示将于3月7日的TrailblazerDX 23上发布Salesforce EinsteinGPT&#xff0c;随后Salesforce的官方Twitter也进行了转发。 虽然还没有正式的新闻稿&#xff0c;但不少业内人士猜测…

chatgpt赋能python:Python图片编辑-利用Python高效便捷地处理图片

Python 图片编辑 - 利用Python高效便捷地处理图片 介绍 随着互联网时代的发展&#xff0c;图片的运用也越来越广泛。对于经常需要处理大量图片的网站/应用程序而言&#xff0c;处理图片已经成为常见的需求之一。Python 作为一种功能强大的编程语言&#xff0c;也可以用来编辑…

2023人工智能发展五大趋势

点击蓝字 / 关注我们 源自&#xff1a;亿欧网 一、生成式AI 机器学习解决方案&#xff0c;正在引领新一代的产品和服务。但是&#xff0c;到目前为止&#xff0c;人工智能主要应用于数据驱动和分析工作流程。创造力和构思被认为非人工智能的能力。 但是&#xff0c;最近出现…

【固收研究】政策面债市情绪

*✧. ‿︵‿୨ 政策面 ୧‿︵‿✧ 政策面&#xff0c;政策面包括货币政策、财政政策以及监管政策等。政策面通过影响资金面、经济运行和市场参与者行为来影响债券市场。一般来说&#xff0c;货币政策偏宽松对债市构成利好&#xff0c;财政政策偏积极对债市构成利空&#xff0c…

AlphaGo 和 ChatGPT有何相似之处? 附AlphaGo核心算法开源链接

AlphaGo 和 ChatGPT 是迄今为止最著名、最具开创性的两个 AI 系统之一。尽管它们被设计用于不同的目的&#xff0c;但它们共享一些重要的相似之处&#xff0c;包括使用深度学习、神经网络以及专注于达到人类水平表现等。而不久前&#xff0c; DeepMind 悄悄开源了AlphaGo的核心…

探索AI图像安全,助力可信AI发展

探索AI图像安全&#xff0c;助力可信AI发展 0. 前言1. 人工智能发展与安全挑战1.1 人工智能及其发展1.2 人工智能安全挑战 2. WAIC 2023 多模态基础大模型的可信 AI2.1 WAIC 2023 专题论坛2.2 走进合合信息 3. AI 图像安全3.1 图像篡改检测3.2 生成式图像鉴别3.3 OCR 对抗攻击技…

GPT3 和它的 In-Context Learning

作者 | 太子长琴 整理 | NewBeeNLP 大家好&#xff0c;这里是NewBeeNLP。ChatGPT 的爆火让很多 NLPer 大吃一惊&#xff0c;焦虑感爆棚&#xff0c;它的思路和方法都不复杂&#xff0c;但效果却出奇的好。 我想任何研究成果的爆发都不可能是一蹴而就的&#xff0c;期间必然包含…

微软总裁布拉德・史密斯:目前 AI 最令人担忧的问题是深度造假

微软总裁布拉德・史密斯&#xff08;Brad Smith&#xff09;周四表示&#xff0c;他对人工智能的最大担忧是 Deep Fakes 深度造假&#xff0c;随着各式各样的人工智能工具出现&#xff0c;这类看起来很逼真但实际是虚假的内容如今越来越普遍了。 在周四于华盛顿的一次演讲中&a…

AI时代带来的图片造假危机,该如何解决

一、前言 当今&#xff0c;图片造假问题非常泛滥&#xff0c;已经成为现代社会中一个严峻的问题。随着AI技术不断的发展&#xff0c;人们可以轻松地通过图像编辑和AI智能生成来篡改和伪造图片&#xff0c;使其看起来真实而难以辨别&#xff0c;之前就看到过一对硕士夫妻为了骗…

扫眼球换“世界币” ChatGPT之父“剥削穷人”?

ChatGPT火爆全球后&#xff0c; 山姆奥特曼&#xff08;Sam Altman&#xff09;创立的加密项目Worldcoin&#xff08;世界币&#xff09;重回大众视野。这个项目诞生于2年前。那时&#xff0c;埋头迭代GPT模型的OpenAI还未如此知名&#xff0c;该公司的CEO 山姆奥特曼也位列科技…