1.派生类构造函数
派生类的构造函数必须自己定义,因为要对新增数据成员进行初始化。如果想要同时初始化基类的数据成员,必须调用基类的构造函数。
创建一个派生类对象的时候,首先调用基类的构造函数,再调用派生类的构造函数。对于析构函数,则先释放派生类再释放基类。
例子:

#include <iostream>#include <string>using namespace std;class St1{public://基类构造函数,初始化成员变量St1(int n, string na, char se):num(n),name(na),sex(se){cout<<"St1"<<endl;}~St1(){cout<<"~St1"<<endl;}protected:int num;string name;char sex;};class St2:public St1{public://派生类调用基类构造函数St2(int n, string na, char se, int a, string add):St1(n,na,se),age(a),addr(add){cout<<"St2"<<endl;}~St2(){cout<<"~St2"<<endl;}void display(){cout<<num<<'\t'<<name<<'\t'<<sex<<'\t'<<age<<'\t'<<addr<<endl; }private:int age;string addr;};int main(){St2 s(200, "ace", 'M', 25, "Hangzhou");s.display();return 0;}

这里将会输出:
St1
St2
200 ace M 25 Hangzhou
~St2
~St1

例子2:包含子对象的派生类构造函数

#include <iostream>#include <string>using namespace std;class St1{public://基类构造函数,初始化成员变量St1(int n, string na, char se):num(n),name(na),sex(se){cout<<"St1"<<endl;}~St1(){cout<<"~St1"<<endl;}void display1(){cout<<num<<'\t'<<name<<'\t'<<sex<<'\t'; }protected:int num;string name;char sex;};class St2:public St1{public://派生类调用基类构造函数St2(int n, string na, char se, int n_m, string na_m, char se_m, int a, string add):St1(n,na,se),monitor(n_m,na_m,se_m){age = a; addr = add;cout<<"St2"<<endl;}~St2(){cout<<"~St2"<<endl;}void display2(){display1();cout<<age<<'\t'<<addr<<endl; }void showmonitor(){cout<<"Monitor is:"<<endl;monitor.display1();cout<<endl;}private:int age;string addr;St1 monitor;//包含子对象};int main(){St2 s(200, "ace", 'M', 11, "HH", 'M', 26, "Shanghai");s.display2();s.showmonitor();return 0;}

输出:
St1
St1
St2
200 ace M 26 shanghai
Monitor is:
11 HH M
~St2
~St1
~St1

注意事项:
1)在调用派生类构造函数之前,系统会先调用基类的构造函数;如果派生类构造函数列表中包含对基类子对象成员的初始化(如上例中的monitor),每个基类子对象初始化时也要调用一次基类构造函数;最后才是派生类调用自身的构造函数来初始化自身新增的成员(如上例中的age,addr)。执行顺序就是派生类构造函数列表顺序:

St2(int n, string na, char se, int n_m, string na_m, char se_m, int a, string add):St1(n,na,se)[1],monitor(n_m,na_m,se_m)[2]

     {age = a; addr = add;cout<<"St2"<<endl;}[3]

2)当然,对上述三种类型进行参数初始化时,会出现以下几种特殊情况:

(a) 派生类新增成员不需要进行初始化(很常见):

St2(int n, string na, char se, int n_m, string na_m, char se_m):St1(n,na,se)[1],monitor(n_m,na_m,se_m)[2]{}

(b)基类没有定义构造函数或者基类构造函数无参—调用基类默认构造函数

St2(int a, string add ){age = a; addr = add;cout<<”St2”<

c++中的派生类构造函数和析构函数相关推荐

  1. 详解派生类构造函数与析构函数

    1.派生类构造函数: 派生类不能继承基类的构造函数,必须自己定义构造函数进行新增数据成员初始化工作,如果想同时初始化基类数据成员,必须调用基类构造函数. (1)简单派生类构造函数: 1 #includ ...

  2. 派生类构造函数和析构函数的执行顺序

    派生类继承了基类的成员,实现了代码的重复利用,但基类的构造函数和析构函数不能被继承.如果在派生类中需要对新增加的成员进行初始化,则需要加入派生类的构造函数.同样派生类也需要添加析构函数来实现一些结束工 ...

  3. 简单的派生类构造函数C++

    **#include<iostream> #include <string> using namespace std; class Student{ public:Studen ...

  4. 构造函数怎么在主函数调用_C++ 虚基类及其派生类构造函数(学习笔记:第7章 12)...

    虚基类及其派生类构造函数[1] 建立对象时所指定的类称为最远派生类. 虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的. 在整个继承结构中,直接或间接继承虚基类的所有派生类,都 ...

  5. 派生类构造函数的执行顺序

    一个派生类构造函数的执行顺序如下: 虚拟基类的构造函数(多个虚拟基类则按照继承的顺序执行构造函数). 基类的构造函数(多个普通基类也按照继承的顺序执行构造函数). 对象的vptr被初始化: 成员对象构 ...

  6. C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? https://www.zhihu.com/question/30838092/answer/49623765

    https://www.zhihu.com/question/30838092/answer/49623765 C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? 代码如下 ...

  7. C++经验(四)-- 基类构造函数和析构函数中调用virtual虚函数?

    class Base {public:Base();virtual void oneFunction() = 0;... };Base::Base() {...oneFunction(); }clas ...

  8. C++中最好不要在构造函数和析构函数中调用虚函数!!!

    1.最好不要在基类和派生类的构造和析构函数中调用虚函数,不会出现多态性 实例如下: #include "iostream"using namespace std;class Bas ...

  9. C++中最好不要在构造函数和析构函数中调用虚函数

    1.最好不要在基类和派生类的构造和析构函数中调用虚函数,不会出现多态性 实例如下: #include "iostream"using namespace std;class Bas ...

最新文章

  1. HDU_1087-Super Jumping! Jumping! Jumping!
  2. 上海大学c语言基础题目,求c语言大神学长学姐解答题目
  3. HTML学习04之内联框架和表单
  4. Makefile(直接可以使用)
  5. win 2008 server 更改远程桌面端口的方法
  6. 华农java实验7_国家实验教学示范中心
  7. Linux学习笔记-gdb调试的补充说明
  8. hadoop2.2单节点集群的搭建
  9. php学习笔记0001 变量作用域
  10. html5网页制作代码_推荐十个好用的HTML5小工具,前端程序员居家必备良品
  11. 存储过程插入100 条数据
  12. 面试题_翻转句子中单词的顺序
  13. centos 网络开启
  14. Latex: 表格内换行
  15. 使用pandas来根据出生日期判断星座
  16. linux i386 4G内存,Ubuntu i386 使用4G内存
  17. 启动tomcat报错:Destroying ProtocolHandler [ajp-nio-8009]
  18. C#窗体程序随电脑分辨率自动调整大小
  19. 晨枫U盘启动盘制作工具V4.0-安装原版Win7
  20. 3D MAX入门训练(1)放样制作胡萝卜

热门文章

  1. 冼牛:即构实时网络调度系统如何应对跨国场景挑战
  2. 用scikit-learn 训练SVM的例子, clf.fit() clf.predict() 的作用
  3. 【P5253】丢番图【数论,数学】
  4. 用户增长的基础、原理和方法论
  5. 条形码设计软件BarTender实用教程——配置文档常见问题解答(一)
  6. 【MySQL】MySQL进阶之路(三)MySQL基础知识点整理
  7. 信用证操作流程实务指南
  8. 利用nginx重定向解决微信H5无法修改安全域名的问题
  9. java图片转单色位图_如何将黑白图保存为单色位图
  10. Python3 爬虫学习笔记 C08【解析库 Beautiful Soup】