派生类的构造函数和析构函数
用户在声明类时可以不定义构造函数,系统会自动设置一个默认的构造函数,在定义类对象时会自动调用这个默认的构造函数。这个构造函数实际上是一个空函数,不执行任何操作。如果需要对类型中的数据成员初始化,应自己定义构造函数。
使用形式:
派生类构造函数名(总参数列表):基类构造函数名(参数列表)
{派生类中新增数据成员初始化语句}
如:
Student(int n,char s):People(n)
派生类构造函数参数列表中,包含基类构造函数所需的参数和派生类新增的的参数。
在建立一个对象时,执行构造函数的顺序是:1、派生类构造函数先调用基类构造函数;2、再执行派生类构造函数本身。
在派生类对象释放时,先执行派生析构函数,在执行基类析构函数。
有子对象的派生类构造函数
在类对象中内嵌对象,称为子对象,即对象中的对象。
子对象的初始化是在建立派生类时通过调用派生类构造函数来是实现的。
派生类构造函数名(总参数列表):基类构造函数名(参数列表),子对对象名(参数列表)
{派生类中新增数据成员初始化语句}
执行派生类构造函数的顺序:
1、调用基类构造函数,对基类数据成员初始化
2、调用子对象构造函数,对子对象数据成员初始化
3、再执行派生类构造函数本身,对派生类数据成员初始化
class Student
{
public:
Student(int n, string nam )
{
num=n;
name=nam;
}
protected:
int num;
string name;
};
class Student1: public Student
{
public:
Student1(int n, string nam,int n1, string nam1,int a, string ad):Student(n,nam),monitor(n1,nam1) //派生类构造函数
{
age=a;
addr=ad;
}
private:
Student monitor;
int age;
string addr;
};
多层派生时的构造函数
派生类构造函数多种形式
- 当不需要对派生类新增的成员进行任何初始化操作时,派生类构造函数的函数体可以为空。
- 如果在基类中没有定义构造函数,或定义了没有参数的构造函数,那么在定义派生类构造函数时可以不写基类构造函数。
- 如果在基类和子对象类型的声明中都没有定义带参数的构造函数,而且也不需要对派生类自己的数据成员出事,则可以不必显示的定义派生类构造函数。
- 如果在基类或子对象类型的声明中定义了带参数的构造函数,那么就必须显示的定义派生类构造函数,并在派生类构造函数中写出基类或子对象类型的构造函数及参数表。
- 如果基类中即定义无参的构造函数,又定义了有参的构造函数,则在定义派生类构造函数时,既可以包含基类构造函数及其参数,也可以不包含基类构造函数。
基类与派生类转换
只有公用派生类才是基类真正的子类型,它完整的继承了基类的功能。
基类与派生类对象之间有赋值兼容关系,由于派生类中包含从基类集成的成员,因此可以将派生类的值赋给基类对象,在用到基类对象的时候可以用其子类对象代替。