多层协议解析 c语言,解析C++中多层派生时的构造函数及一些特殊形式 – C语言笔记 – CFEI.NET...

生命不息,学习不止,来 继续搞起C语言。

通过例下面的程序,读者可以了解在多级派生情况下怎样定义派生类的构造函数。相信大家完全可以自己看懂这个程序。

[例] 多级派生情况下派生类的构造函数。

#include

#include

using namespace std;

class Student//声明基类

{

public://公用部分

Student(int n, string nam)//基类构造函数

{

num=n;

name=nam;

}

void display( )//输出基类数据成员

{

cout<

cout<

}

protected://保护部分

int num;//基类有两个数据成员

string name;

};

class Student1: public Student//声明公用派生类Student1

{

public:

Student1(int n,char nam[10],int a):Student(n,nam)//派生类构造函数

{age=a;}//在此处只对派生类新增的数据成员初始化

void show( ) //输出num,name和age

{

display( ); //输出num和name

cout<

}

private://派生类的私有数据

int age; //增加一个数据成员

};

class Student2:public Student1 //声明间接公用派生类Student2

{

public://下面是间接派生类构造函数

Student2(int n, string nam,int a,int s):Student1(n,nam,a) {score=s;}

void show_all( ) //输出全部数据成员

{

show( ); //输出num和name

cout<

}

private:

int score; //增加一个数据成员

};

int main( )

{

Student2 stud(10010,"Li",17,89);

stud.show_all( ); //输出学生的全部数据

return 0;

}

运行时的输出如下:

num:10010

name:Li

age:17

score:89

请注意基类和两个派生类的构造函数的写法。

基类的构造函数首部:

Student(int n, string nam)

派生类Student1的构造函数首部:

Student1(int n, string nam],int a):Student(n,nam)

派生类Student2的构造函数首部:

Student2(int n, string nam,int a,int s):Student1(n,nam,a)

注意不要写成:

Student2(int n, string nam,int a,int s):Student1(n,nam),student1(n, nam, a)

不要列出每一层派生类的构造函数,只需写出其上一层派生类(即它的直接基类)的构造函数即可。在声明Student2类对象时,调用Student2构造函数;在执行Student2构造函数时,先调用Student1构造函数;在执行Student1构造函数时,先调用基类Student构造函数。初始化的顺序是:

先初始化基类的数据成员num和name。

再初始化Student1的数据成员age。

最后再初始化Student2的数据成员score。

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

在使用派生类构造函数时,有以下特殊的形式。

1) 当不需要对派生类新增的成员进行任何初始化操作时,派生类构造函数的函数体可以为空,即构造函数是空函数,函数体为空时,派生类构造函数的参数个数等于基类构造函数和子对象的参数个数之和,派生类构造函数的全部参数都传递给基类构造函数和子对象,在调用派生类构造函数时不对派生类的数据成员初始化。此派生类构造函数的作用只是为了将参数传递给基类构造函数和子对象,并在执行派生类构造函数时调用基类构造函数和子对象构造函数。在实际工作中常见这种用法。

2) 如果在基类中没有定义构造函数,或定义了没有参数的构造函数,那么在定义派生类构造函数时可不写基类构造函数。因为此时派生类构造函数没有向基类构造函数传递参数的任务。调用派生类构造函数时系统会自动首先调用基类的默认构造函数。

如果在基类和子对象类型的声明中都没有定义带参数的构造函数,而且也不需对派生类自己的数据成员初始化,则可以不必显式地定义派生类构造函数。因为此时派生类构造函数既没有向基类构造函数和子对象构造函数传递参数的任务,也没有对派生类数据成员初始化的任务。

在建立派生类对象时,系统会自动调用系统提供的派生类的默认构造函数,并在执行派生类默认构造函数的过程中,调用基类的默认构造函数和子对象类型默认构造函数。

如果在基类或子对象类型的声明中定义了带参数的构造函数,那么就必须显式地定义派生类构造函数,并在派生类构造函数中写出基类或子对象类型的构造函数及其参数表。

如果在基类中既定义无参的构造函数,又定义了有参的构造函数(构造函数重载),则在定义派生类构造函数时,既可以包含基类构造函数及其参数,也可以不包含基类构造函数。

在调用派生类构造函数时,根据构造函数的内容决定调用基类的有参的构造函数还是无参的构造函数。编程者可以根据派生类的需要决定采用哪一种方式。

把你知道的全都show出来,渴了累了,让熊熊燃烧的功利之火治愈你好吗,baby~?

这年头你做了什么,你自己忘了互联网都不会忘,你的分享并不是免费的,长远来看,它能带给你的正面影响是无价的。

后续会有更多的精彩的内容分享给大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值