简单的派生类的构造函数
#include<iostream>
#include<string>
usingnamespacestd;
classStudent//声明基类
{
protected:
intnum;
stringname;
charsex;
public:
Student(intn,stringnam,chars)//定义基类(含参)构造函数
{
num=n;
name=nam;
sex=s;
}
};
classStudent1:publicStudent//声明公用派生类Student1
{
private:
intage;
stringaddr;
public:
Student1(intn,stringnam,chars,inta,stringad):Student(n,nam,s)
//定义派生类构造函数
{
age=a;
addr=ad;
}
voidshow()
{
cout<<"num:"<
cout<<"name:"<
cout<<"sex:"<
cout<<"age:"<
cout<<"address"<
}
~Student1 (){}
};
派生类构造函数首行的写法
Student1(intn,stringnam,chars,inta,stringad):Student(n,nam,s)
派生类构造函数一般形式为
派生类构造函数名(总参数表):基类构造函数名(参数表)
{派生类中新增数据成员初始化语句}
冒号“:”前面部分是派生类构造函数的主干,他和以前介绍过的构造函数的形式相同,但它的总参数表中包括基类构造函数所需的参数和对派生类新增的数据成员初始化所需的参数。冒号“:”后面部分是要调用的基类构造函数及其参数。
从上面列出的派生类Student1构造函数首行中可以看到,派生类构造函数名(Student1)后面括号内的参数表中包括参数的类型和参数名(如int n) ,而基类构造函数名后面括号内的参数表列只有参数名而不包括参数类型(如n,num,s),因为在这里不是定义基类构造函数,而是调用基类构造函数,因此这些参数是实参而不是形参。它们可以是常量、全局变量和派生类构造参数总参数表中的参数。
从上面列出的派生类Student1构造函数中可以看到:调用基类构造函数Student时给出3个参数(n,nam,s),这是和定义基类构造函数时指定的参数相匹配的。派生类构造函数Student1有5个参数,其中前3个是用来传递给基类构造函数,后面两个(a和ad)是用来对派生类所增加的数据成员初始化的。
2.派生类的析构函数
析构函数的作用是在对象撤销之前,进行必要的清理工作。
在派生时,派生类是不能继承基类的析构函数的,也需要通过派生类的析构函数去调用基类的析构函数。在派生类中可以根据需要定义自己的析构函数,用来地派生类中所增加的成员进行清理工作。基类的清理工作任然由基类的析构函数负责。
调用的顺序与构造函数正好相反:先执行派生类自己的析构函数,对派生类新增加的成员进行清理,然后调用子对象的析构函数,对子对象进行清理,最后调用基类的析构函数,对基类进行清理。