一.简单派生类的析构函数和构造函数。
1.简单派生类构造函数的定义形式:派生类构造函数名 (总参数表列):基类构造函数名 (参数表列){ 派生类新增加数据成员初始化语句}
其中,总参数表列中的参数包括派生类参数和基类参数,且基类参数放在最前面。
参数表列里中只有参数名,没有参数类型。
2.注意简单派生类构造函数的定义形式中,中间有一个冒号。
3.参数表列的参数并不是形参,而是实参,它是由总参数表列中传递过来的。
4.派生类和基类析构函数定义方法相同:~析构函数名(){ },注意花括号后边不加分号。
5.与派生类构造函数和析构函数相关的代码如下:
#include<iostream>
#include<string>
using namespace std;
class Student//定义基类对象
{
public:
Student(int n,string na):num(n),name(na){}//定义基类构造函数
~Student() {}//定义基类析构函数
protected:
int num;
string name;
};
class student1:public Student//定义派生类对象
{
public:
//student1(int n, string na, float s, char se) :Student(n, na)//定义派生类构造函数
//{
// score = s;
// sex = se;
//}
student1(int n,string na,float s,char se):Student(n,na),score(s),sex(se){}//也可以通过这种方式定义派生类构造函数
void display()
{
cout << "学号:" << num<<" " << "姓名:"<< name <<" "
<< "成绩:"<<score <<" "<< "性别:" << sex;
}
~student1(){}//定义派生类析构函数
private:
float score;
char sex;
};
int main()
{
student1 s(2019, "刘子祥", 100, 'm');//定义派生类对象
s.display();
return 0;
}
二.有子对象的派生类构造函数
1.在类对象中内嵌的作为数据成员的对象称为子对象。
2.子对象的初始化是在建立派生类时通过派生类构造函数来实现的。
3.子对象肯定是属于另一类的对象,因此子对象的数据成员与类的数据成员对应。
4.代码示例如下:
#include<iostream>
#include<string>
using namespace std;
class Student//定义一个基类
{
public:
Student(int n, string na):num(n),name(na){}//定义基类构造函数
void display()
{
cout << num << " " << name<<endl;
}
protected:
int num;
string name;
};
class Student1 :public Student//定义派生类,继承方式为public类型
{
public:
Student1(int n,string na,int n1,string na1,float sc,char se):Student(n,na),s(n1,na1)//定义有子对象的派生类构造函数
{
score = sc; sex = se;
}
void display_s()//输出学号,姓名,成绩,姓名,其中学号和成绩通过display函数输出
{
display();
cout << score << " " << sex << endl;
}
void display_m()//输出班长信息
{
s.display();
}
private:
Student s;//定义一个对象成员
float score;
char sex;
};
int main()
{
Student1 s(20191, "lzx", 20192, "gaoxin", 99, 'm');//定义派生类对象
s.display_s();
s.display_m();
return 0;
}
5.总结:
有子对象的派生类构造函数定义形式如下:
派生类构造函数名(总参表列):基类构造函数名(参数表列)子对象名(参数表列){派生类数据成员初始化语句}
6.编译系统是根据基类和子对象的参数名来确立他们的参数关系的。
三.多层派生时的构造函数
1.多层派生的构造函数是在上面简单派生类构造函数和有子对象构造函数的基础上编写的。
2.多层派生类构造函数的书写,只需写出其上一层构造函数的参数的同时也写出新增的参数,不必一层一层列出。
3.派生类构造函数的函数体可以为空,即花括号的内容可以为空。