第46课 继承中的构造与析构

思考:

如何初始化父类成员?

父类构造函数和子类构造函数有什么关系?

子类对象的构造:

 

子类构造函数对继承而来的成员进行初始化有两种方式:

1、直接通过初始化列表或者赋值的方式进行初始化

2、调用父类构造函数进行初始化

父类构造函数在子类中的调用方式:

 

显式调用只能在初始化列表进行。

如下:

 

 示例程序:

第30行会调用子类的无参构造函数Child(),而这个构造函数会默认调用父类的无参构造函数,因为父类没有默认构造函数,因此报错。

 在父类中加上无参构造函数即可:

继续完善:

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 class Parent 
 7 {
 8 public:
 9     Parent()
10     {
11         cout << "Parent()" << endl;
12     }
13     Parent(string s)
14     {
15         cout << "Parent(string s) : " << s << endl;
16     }
17 };
18 
19 class Child : public Parent
20 {
21 public:
22     Child()
23     {
24         cout << "Child()" << endl;
25     }
26     Child(string s) : Parent(s)
27     {
28         cout << "Child(string s) : " << s << endl;
29     }
30 };
31 
32 int main()
33 {       
34     Child c; 
35     Child cc("cc");
36     
37     return 0;
38 }

35行会触发26行的子类构造函数,在调用子类的构造函数前,先调用父类的Parent(string s)这个构造函数。

输出结果如下:

 子类对象的构造:

 

深度解析:

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 class Object
 7 {
 8 public:
 9     Object(string s)
10     {
11         cout << "Object(string s) : " << s << endl;
12     }
13 };
14 
15 class Parent : public Object
16 {
17 public:
18     Parent() : Object("Default")
19     {
20         cout << "Parent()" << endl;
21     }
22     Parent(string s) : Object(s)
23     {
24         cout << "Parent(string s) : " << s << endl;
25     }
26 };
27 
28 class Child : public Parent
29 {
30     Object mO1;
31     Object mO2;
32 public:
33     Child() : mO1("Default 1"), mO2("Default 2")
34     {
35         cout << "Child()" << endl;
36     }
37     Child(string s) : Parent(s), mO1(s + " 1"), mO2(s + " 2")
38     {
39         cout << "Child(string s) : " << s << endl;
40     }
41 };
42 
43 int main()
44 {       
45     Child cc("cc");
46     
47     return 0;
48 }

运行结果如下:

 

 

子类对象的析构:

 

 

 示例程序:

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 class Object
 7 {
 8     string ms;
 9 public:
10     Object(string s)
11     {
12         cout << "Object(string s) : " << s << endl;
13         ms = s;
14     }
15     ~Object()
16     {
17         cout << "~Object() : " << ms << endl;
18     }
19 };
20 
21 class Parent : public Object
22 {
23     string ms;
24 public:
25     Parent() : Object("Default")
26     {
27         cout << "Parent()" << endl;
28         ms = "Default";
29     }
30     Parent(string s) : Object(s)
31     {
32         cout << "Parent(string s) : " << s << endl;
33         ms = s;
34     }
35     ~Parent()
36     {
37         cout << "~Parent() : " << ms << endl;
38     }
39 };
40 
41 class Child : public Parent
42 {
43     Object mO1;
44     Object mO2;
45     string ms;
46 public:
47     Child() : mO1("Default 1"), mO2("Default 2")
48     {
49         cout << "Child()" << endl;
50         ms = "Default";
51     }
52     Child(string s) : Parent(s), mO1(s + " 1"), mO2(s + " 2")
53     {
54         cout << "Child(string s) : " << s << endl;
55         ms = s;
56     }
57     ~Child()
58     {
59         cout << "~Child() " << ms << endl;
60     }
61 };
62 
63 int main()
64 {       
65     Child cc("cc");
66     
67     cout << endl;
68     
69     return 0;
70 }

执行结果如下:

 

小结:

 

转载于:https://www.cnblogs.com/wanmeishenghuo/p/9574731.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的体育馆管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集处理数据信息的管理方式。本体育馆管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此体育馆管理系统利用当下成熟完善的SpringBoot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线选择试题并完成答题,在线查看考核分数。管理员管理收货地址管理、购物车管理、场地管理、场地订单管理、字典管理、赛事管理、赛事收藏管理、赛事评价管理、赛事订单管理、商品管理、商品收藏管理、商品评价管理、商品订单管理、用户管理、管理员管理等功能。体育馆管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:体育馆管理系统;SpringBoot框架;Mysql;自动化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值