php 派生类 构造,C++派生类的构造函数和析构函数

派生类对象中包含基类对象,因此派生类对象在创建时,除了要调用自身的构造函数进行初始化外,还要调用基类的构造函数初始化其包含的基类对象。因此,程序中任何能够生成派生类对象的语句,都要说明其包含的基类对象是如何初始化的。

如果对此不做说明,则编译器认为基类对象要用无参构造函数初始化——如果基类没有无参构造函数,则会导致编译错误。

在执行一个派生类的构造函数之前,总是先执行基类的构造函数。

和封闭类说明成员对象如何初始化类似,派生类说明基类对象如何初始化,也需要在构造函数后面添加初始化列表。在初始化列表中,要指明调用基类构造函数的形式。具体写法如下:

构造函数名(形参表): 基类名(基类构造函数实参表)

{

...

}

派生类对象消亡时,先执行派生类的析构函数,再执行基类的析构函数。

下面的程序演示了派生类的构造函数和析构函数的调用顺序:

#include

#include

using namespace std;

class CBug {

int legNum, color;

public:

CBug(int ln, int c1) : legNum(ln), color(c1)

{

cout << "CBug Constructor" << endl;

};

~CBug()

{

cout << "CBug Destructor" << endl;

}

void Printlnfo()

{

cout << legNum << "," << color << endl;

}

};

class CFlyingBug : public CBug

{

int wingNum;

public:

//CFlyingBug(){} 若不注释掉则会编译出错

CFlyingBug::CFlyingBug(int ln, int c1, int wn) : CBug(ln, c1), wingNum(wn)

{

cout << "CFlyingBug Constructor" << endl;

}

~CFlyingBug()

{

cout << "CFlyingBug Destructor" << endl;

}

};

int main() {

CFlyingBug fb(2, 3, 4);

fb.Printlnfo();

return 0;

}

程序输出结果:

CBug Constructor

CFlyingBug Constructor

2,3

CFlyingBug Destructor

CBug Destructor

第 25 行如果没有注释掉会编译出错。因为这个构造函数没有说明在派生类对象用该构造函数初始化的情况下,其基类对象该如何初始化——这也就意味着基类对象应该用无参构造函数初始化,可是 CBug 类并没有无参构造函数,所以编译会出错。

第 26 行中的“CBUg(ln, c1)”指明了在派生类对象用该构造函数初始化的情况下,其基类对象的初始化方式。

思考题:派生类对象生成时要先执行基类构造函数,消亡时要先执行自身析构函数,再执行基类析构函数,为什么?

和封闭类的情况类似,如果一个派生类对象是用默认复制构造函数初始化的,那么它内部包含的基类对象也要用基类的复制构造函数初始化。

多层次的派生

在 C++ 中,派生可以是多层次的。例如学生类派生出中学生类,中学生类又派生出初中生类和高中生类。总之,类 A 派生类 B,类 B 可再派生类 C,类 C 又能派生类 D,以此类推。

这种情况下,称类 A 是类 B 的直接基类,类 B 是类 C 的直接基类,类 A 是类 C 的间接基类。当然,类 A 也是类 D 的间接基类。在定义派生类时,只写直接基类,不写间接基类。派生类沿着类的层次自动向上继承它所有的间接基类。

派生类的成员包括派生类自己定义的成员、直接基类中定义的成员,以及所有间接基类的全部成员。

当派生类的对象生成时,会从最顶层的基类开始逐层往下执行所有基类的构造函数,最后再执行自身的构造函数;当派生类对象消亡时,会先执行自身的析构函数,然后从底向上依次执行各个基类的析构函数。

例如下面的程序:

#include

using namespace std;

class A {

public:

int n;

A(int i) :n(i) { cout << "A " << n << " constructed" << endl; }

~A() { cout << "A " << n << " destructed" << endl; }

};

class B :public A

{

public:

B(int i) :A(i) { cout << "B constructed" << endl; }

~B() { cout << "B destructed" << endl; }

};

class C :public B {

public:

C() :B(2) { cout << "B constructed" << endl; }

~C() { cout << "B destructed" << endl; }

};

int main()

{

C Obj;

return 0;

}

程序的输出结果:

A 2 constructed

B constructed

B constructed

B destructed

B destructed

A 2 destructed

包含成员对象的派生类

在派生类也是封闭类的情况下,构造函数的初始化列表不但要指明基类对象的初始化方式,还要指明成员对象的初始化方式。

派生类对象生成时,会引发一系列构造函数调用,顺序是:先从上至下执行所有基类的构造函数,再按照成员对象的定义顺序执行各个成员对象的构造函数,最后执行自身的构造函数;而派生类对象消亡时,先执行自身的析构函数,然后按与构造的次序相反的顺序依次执行所有成员对象的析构函数,最后再从底向上依次执行各个基类的析构函数。

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

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

相关文章

我的C#/.NET学习诀窍——LINQPad

在我以往的文章中&#xff0c;尤其涉及代码演示的&#xff0c;都使用了同一个工具——LINQPad。但许多客户面对我分享的.linq源文件都迷茫不知所措&#xff0c;因此有必要来聊聊一下这个强大的工具。本文首先将对该工具做个简单的介绍&#xff0c;并且分享一些LINQPad的优点&am…

数学在生活中无处不在,36个生活小故事涵盖小学所有的数学知识!

数学不是脱离生活的&#xff0c;而是源于生活&#xff0c;更要回归于生活。解决生活中遇到的问题&#xff0c;就是最自然的数学应用题。生活场景中的学习&#xff0c;是最生动的体验式学习机会。用学到的数学知识来解决生活中的问题&#xff0c;正是孩子体会数学奥妙的绝佳机会…

每天的0点php,使用strtotime,这个月的第一天凌晨0点在PHP?(Using just strtotime, 0 am first day of this month in PHP?)...

使用strtotime&#xff0c;这个月的第一天凌晨0点在PHP&#xff1f;(Using just strtotime, 0 am first day of this month in PHP?)echo mydate(strtotime(1 am first day of this month));以上工作结果2017-10-01 01:00:00 &#xff0c;但我很难在凌晨0点做到。 24am, 24pm,…

面试八股文:你写过自定义任务调度器吗?

最近入职了新公司&#xff0c;尝试阅读祖传代码&#xff0c;记录并更新最近的编程认知。思绪由Q1引发&#xff0c;后续Q2、Q3基于Q1的发散探究Q1. Task.Run、Task.Factory.StartNew 的区别&#xff1f;我们常使用Task.Run和Task.Factory.StartNew创建并启动任务&#xff0c;但是…

快速掌握MATLAB应用,从这一步开始

有人说&#xff0c;“MATLAB除了不会生孩子&#xff0c;什么都会。”矩阵运算、数据可视化、GUI&#xff08;用户界面&#xff09;设计、甚至是连接其他编程语言&#xff0c;MATLAB都能轻松实现&#xff01;那么&#xff0c;MATLAB到底有多厉害&#xff1f;MATLAB拥有丰富的算法…

Solarwinds的NetFlow Traffic Analyzer中的Cisco设备配置

如果要使用Solarwinds的NetFlow Traffic Analyzer这个产品首先要安装Orion然后再安装Netflow&#xff0c;其次要设备支持Netflow&#xff0c;下面列出的是支持netflow的cisco设备&#xff1a;支持cisco netflower的cisco设备2007-08-16 15:09 Cisco 800, 1700, 1800, 2800, 380…

mobile.php discuz,电脑访问discuz手机版【触屏版跳转标准版的修改方法】

推荐方法&#xff1a;以前我们介绍过如何通过修改Chrome浏览器运行参数的方法来模拟手机访问网站&#xff0c;但是在Chrome 32和33版本以后增加了更加便捷的方法&#xff0c;在开发者工具中只需要设置一下就能方便的模拟各种手机型号的访问效果了。方法如下&#xff1a;1、打开…

深入探究ASP.NET Core读取Request.Body的正确方式

前言相信大家在使用ASP.NET Core进行开发的时候&#xff0c;肯定会涉及到读取Request.Body的场景&#xff0c;毕竟我们大部分的POST请求都是将数据存放到Http的Body当中。因为笔者日常开发所使用的主要也是ASP.NET Core所以笔者也遇到这这种场景&#xff0c;关于本篇文章所套路…

送给“苦逼”的IT人系列1:IT人的“钱”景以及收入的两道坎

虽然IT工作五花八门&#xff0c;而且年纪有老有少&#xff0c;但IT人的收入总体还是比较有规律的&#xff0c;很明显的可以看出有两道坎&#xff0c;分别是10W&#xff0c;和30W&#xff0c;当然&#xff0c;我说的是年薪&#xff0c;是RMB&#xff0c;不包含任何跟销售相关的提…

追MM的各种算法

全世界有3.14 % 的人已经关注了数据与算法之美动态规划基本上就是说&#xff1a;你追一个MM的时候&#xff0c;需要对该MM身边的各闺中密友都好&#xff0c;这样你追MM这个问题就分解为对其MM朋友的问题&#xff0c;只有把这些问题都解决了&#xff0c;最终你才能追到MM。因此&…

gRPC在C#中的未来属于grpc-dotnet

作者&#xff1a;Jan Tattermuschgrpc-dotnet&#xff08;Grpc.Net.Client[1]和Grpc.AspNetCore.Server[2] nuget 包&#xff09;现在是.NET/C#中推荐的 gRPC 实现。最初的 gRPC C#实现&#xff08;Grpc.Core nuget 包&#xff09;将进入维护模式&#xff0c;不会得到任何新功能…

(部分来自windows核心编程)远程注入dll

{//仅仅支持ANSI路径//find the wndHWND hwnd FindWindow(NULL,"1.txt - 记事本");//get pidDWORD tid,pid;tid GetWindowThreadProcessId(hwnd,&pid);if (0pid)//for test{pid GetCurrentProcessId();}HANDLE hProcess OpenProcess(PROCESS_ALL_ACCESS,FALS…

linux命令apprw,linux命令学习1(示例代码)

[[email protected] app]# cat /etc/redhat-releaseCentOS Linux release 7.1.1503 (Core)总用量 2636-rw-r--r--. 1 root root 1222783 10月 28 12:09 Glances-1.7.1.tar.gz-rw-r--r--. 1 root root 388499 11月 7 13:20 htop-1.0.2.tar.gz-rw-r--r--. 1 root root 1081874 …

ML.NET 示例:对象检测

ML.NET 版本API 类型状态应用程序类型数据类型场景机器学习任务算法v1.4动态API最新控制台应用程序图像文件对象检测深度学习Tiny Yolo2 ONNX 模型有关如何构建此应用程序的详细说明&#xff0c;请参阅Microsoft Docs网站上附带的教程。问题对象检测是计算机视觉中的一个经典问…

双十一来了,揭秘菜鸟物流背后的那些算法黑科技

又是一年双十一&#xff0c;又一个巨大的挑战摆在了包括菜鸟网络在内的物流面前&#xff0c;但随着人工智能、大数据的应用越来越广泛&#xff0c;无人化仓储、无人化配送越来越多&#xff0c;供应链越来越扁平化&#xff0c;各种算法应用到物流领域的每一个细节。那么&#xf…

socket编程资料-网络收集

1、什么是Socket&#xff1f; Socket又称之为“套接字”&#xff0c;是系统提供的用于网络通信的方法。它的实质并不是一种协议&#xff0c;没有规定计算机应当怎么样传递消息&#xff0c;只是给程序员提供了一个发送消息的接口&#xff0c;程序员使用这个接口提供的方法&#…

linux监听端口丢失,linux – 如果没有监听端口,则为Systemd重启服务

我建议你采用不同的方法,并使用专用的监控工具来实现这一目标.我最喜欢的监控工具,允许重新启动服务,以防它们崩溃,或者不再在其配置的端口上监听,这是monit&#xff1a;https://packages.debian.org/jessie/monit配置文件中有很多示例,在此站点和其他地方有关设置的示例.我将列…

开源推荐:Asp.Net Core入门学习手册!

前言推荐一个入门级的.NET Core开源项目&#xff0c;非常适合新手入门学习.NET Core。开源地址:https://github.com/windsting/little-aspnetcore-book。手册在线下载地址&#xff1a;https://nbarbettini.gitbooks.io/little-asp-net-core-book/content/chapters/mvc-basics/c…

如何拿到高薪数据分析师offer?从精准解读一篇招聘信息开始!

大家好&#xff0c;我是大鹏&#xff0c;目前是一名数据分析师&#xff0c;从非本专业成功转行&#xff0c;创立“数据团学社”“城市数据研习社”&#xff0c;运营数十万人社群&#xff0c;联合发起“城市数据团”。最近有很多学弟学妹咨询我入行数据分析师的情况。总体上说&a…

微软翻译api的使用介绍和注意事项

google翻译api已经收费了&#xff0c;而微软翻译api目前是免费的&#xff0c;支持几种不同的方式访问&#xff0c;如果感兴趣可以自己封装下协议处理。官方介绍&#xff1a; http://msdn.microsoft.com/en-us/library/hh454950.aspx。 这里介绍一下java下的使用。Java下使用微软…