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

派生类的构造函数和析构函数

#include <iostream>
using namespace std;
class student
{
public:
    student(int num,char* n):number(num),name(n){}
    ~student(){cout << "student deconstruted" << endl;}
protected:
    int number;
    char* name;
};
class student1:public student
{
public:
    student1(int num,char* n,bool s,int a):student(num,n),sex(s),age(a){}
    void show();
    ~student1(){cout << "student1 deconstruted" << endl;}
protected:
    bool sex;
    int age;
};
void student1::show()
{
    cout << "num: " << number << endl;
    cout << "name: " << name << endl;
    cout << "age: " << age << endl;
    cout << "sex: " << sex << endl;
}
int main()
{
    student1 stu(45,"shukai",true,20);
    stu.show();
    return 0;
}

1.1派生类构造函数的一般形式为:

派生类构造函数名(总参数表列):基类构造函数名(参数表列)
{派生类新增加的成员的初始化语句}
1.2对派生类新增加的成员可以用初始化表进行初始化。如:
student1(int num,char* n,bool s,int a):student(num,n),sex(s),age(a){}
1.3在类中对派生类构造函数做声明时,不包括基类构造函数名以及参数表列(student(num,n)),只在定义函数时将它列出。
1.4建立一个对象时,执行构造函数的顺序:
A.派生类构造函数调用基类的构造函数。
B.再执行派生类构造函数体本身(即派生类构造函数的函数体)

有子对象的派生类构造函数

#include <iostream>
using namespace std;
class student
{
public:
    student(int n,char* nam):num(n),name(nam){}
    void display(){cout << name << " " << num << endl;}
protected:
    int num;
    char* name;
};
class student1:public student
{
public:
    student1(int n,char* nam,int n1,char* nam1,int a,bool s):student(n,nam),
        monitor(n1,nam1),age(a),sex(s){}
    void display1();
    void display_monitor();
private:
    int age;
    bool sex;
    student monitor;
};
void student1::display1()
{
    cout << "student is " << endl;
    display();
    cout << age << " " << sex << endl;
}
void student1::display_monitor()
{
    cout << "monitor is " << endl;
    cout << age << " " << sex << endl;
}
int main()
{
    student1 stu(45,"shukai",1,"abc",20,true);
    stu.display1();
    stu.display_monitor();
    return 0;
}

1.1类的数据成员除了标准成员,如(int,char)或系统提供的类型(如string),实际上,类的数据成员中还可以包含类对象,如可以声明一个类时包含这样的数据成员:

Student s1;
这时,s1就是类对象中的内嵌对象,称为子对象(subobject)。
1.2派生类构造函数的任务应该包括3部分:
A.对基类成员的初始化
B.对子对象数据成员的初始化。
C.对派生类数据成员的初始化。
1.3定义派生类构造函数的一般形式为:
派生类构造函数名(总参数表列);基类构造函数名(参数表列),子对象名(参数表列)
{派生类中新增数据成员的初始化语句}
如:student1(int n,char* nam,int n1,char* nam1,int a,bool s):student(n,nam),monitor(n1,nam1),age(a),sex(s){}
只不过派生类中的新生成员用初始化列表来进行初始化而已。
1.4基类构造函数和子对象的次序是可以任意的,如上面的构造函数可以写成:
student1(int n,char* nam,int n1,char* nam1,int a,bool s):monitor(n1,nam1),student(n,nam),age(a),sex(s){}

编译系统是根据相同的参数名,而不是根据参数的次序来传递数据的。

多层派生时的构造函数

#include <iostream>
#include <string>
using namespace std;
class student
{
public:
    student(int n,string nam){num=n;name=nam;}
    void display(){cout << "num: " << num << " name: " << name << endl;}
protected:
    int num;
    string name;
};
class student1:public student
{
public:
    student1(int n,string nam,int a):student(n,nam),age(a){}
    void display1(){display();cout << "age: " << age << endl;}
protected:
    int age;
};
class student2:public student1
{
public:
    student2(int n,string nam,int a,bool s):student1(n,nam,a),sex(s){}
    void display2(){display1();cout << "sex: " << sex << endl;}
protected:
    bool sex;
};
int main()
{
    student2 stu(45,"shukai",20,true);
    stu.display2();
    return 0;
}

1.1 student2的构造函数为student2(int n,string nam,int a,bool s):student1(n,nam,a),sex(s){},注意不必列出每一层的构造函数,只要列出上一层的构造函数即可。

派生类构造函数的特殊形式

1.1当不需要对派生类新增成员做任何初始化操作的时候,派生类构造函数的函数体可以为空,即构造函数是空函数。
1.2如果在基类中没有构造函数或者定义了没有参数的构造函数,那么在定义派生类的构造函数时可以不必写基类的构造函数。

派生类的析构函数

1.1析构函数与派生类的构造函数相反,构造函数是先构造基类在构造子对象再构造派生类,而析构时,先对派生类析构,再对子对象析构,然后再对基类析构。

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

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

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

  2. c++, 派生类的构造函数和析构函数 , [ 以及operator=不能被继承 or Not的探讨]

    说明:文章中关于operator=实现的示例,从语法上是对的,但逻辑和习惯上都是错误的. 参见另一篇专门探究operator=的文章:<c++,operator=>http://www.c ...

  3. C++中基类与派生类的构造函数和析构函数

    1.Cpp中的基类与派生类的构造函数 基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承.构造函数不能被继承是有道理的,因为即使继承了,它的名字和 ...

  4. 派生类的构造函数和析构函数

    一.简单派生类的析构函数和构造函数. 1.简单派生类构造函数的定义形式:派生类构造函数名 (总参数表列):基类构造函数名 (参数表列){ 派生类新增加数据成员初始化语句} 其中,总参数表列中的参数包括 ...

  5. c++派生类和基类的构造函数和析构函数

    基类和派生类的构造函数顺序,先调用基类的构造函数,在调用派生类的构造函数, 析构函数而言,先调用派生类的析构函数,再调用基类的析构函数 #include<iostream> using n ...

  6. 6.12C++:继承基类的构造函数、单继承的构造函数、多继承的构造函数、派生类复制构造函数、派生类的析构函数

    1 继承基类的构造函数 class A{public:A(){}; // A的构造函数 }; class B : public A{public:using A:A: } 2 单继承的构造函数 cla ...

  7. 派生类中构造函数与虚构函数的研究

    1.继承过程中的构造函数 A:继承与派生过程中,基类的构造函数不能被继承,派生类中需要声明自己的构造函数. B:声明构造函数时,只需要对本类中新增成员进行初始化.至于基类继承过来的成员,应该调用基类的 ...

  8. C++类的构造函数、析构函数与赋值函数

    C++类的构造函数.析构函数与赋值函数 构造函数.析构函数与赋值函数是每个类最基本的函数.它们太普通以致让人容易麻痹大意,其实这些貌似简单的函数就象没有顶盖的下水道那样危险. 每个类只有一个析构函数和 ...

  9. 基类和派生类的构造函数,隐式调用与显式调用

    1. 顺序        当创建一个派生类的对象时,系统首先自动创建一个基类对象,也就是说,在调用派生类构造函数创建派生类对象之前,系统首先调用基类的构造函数创建基类对象.当派生类对象生命期结束时,首 ...

最新文章

  1. python【蓝桥杯vip练习题库】ALGO-118连续正整数的和(枚举优化)
  2. 怎么改变光标Cursor(5种方法)
  3. 实验六 数组 (2)
  4. 腾讯云服务器 linux 镜像安装项目环境mysql心得
  5. Android URLconnection
  6. 学计算机与学英语作文,初二英语作文(关于计算机与学习)
  7. 【OpenGL从入门到精通(二)】绘制一个点
  8. Eclipse中将java类打成jar包形式运行
  9. 证书体系: PFX 文件格式解析
  10. 添加MD5 密码加密
  11. Spark中的数据本地性
  12. PHP之Smarty模板学习
  13. 利用老毛桃启动盘制作三合一系统启动:WINPE + CDlinux + Ubuntu
  14. 用户可以通过软件对计算机,用户可以通过____软件对计算机软、硬件资源进行管理。...
  15. labview和python哪个易学_如何学好labview?
  16. 富士通Fujitsu DPK700S 打印机驱动
  17. 详解黑客的攻击方式1---网络欺骗攻击
  18. python list 交集并集差集补集
  19. setBackgroundResource()与setImageBitmap()以及setBackground()的使用
  20. 第五人格显示服务器错误,第五人格服务器异常玩家秒变GM,时装随便买,玩家:这感觉真好!...

热门文章

  1. 优酷视频如何将地区设置为中国大陆
  2. NAVICAT MYSQL 建表字段 默认值、EMPTY STRING、空白、NULL 的区别
  3. php与mysql手册下载地址_PHP与Mysql的连接
  4. android两个java文件内容_java – 在1个请求中将多个文件从Android上传...
  5. java string字符操作_Java对String类型字符串的各种操作姿势
  6. c语言编程游戏开代码错误,[蓝桥杯][历届试题]数字游戏 (C语言代码)(兄弟们帮我看一下为什么运行错误86%)...
  7. x86_64 arm制linux-gcc,arm-linux-gcc 制作
  8. ddns 被解析为127.0.0.1_我为北京冬奥加油,2020.2.1-2.10冬奥知识分享
  9. C语言文件与数组之间输入输出操作
  10. matlab guide对话框+滑动条+弹出式菜单+列表框的使用