派生类的构造函数
-
因为派生类不能继承基类的构造函数,所以必须定义自己的构造函数。并且派生类拥有自己的数据成员,因此,派生类的构造函数除了需要对自己的数据成员进行初始化外,还必须调用基类的构造函数初始化基类的数据成员。这种调用过程是编译系统自动完成的。若基类函数需要一些形参,派生类构造函数必须要传相应的参数给基类构造函数,否则编译会出现错误。
-
派生类构造函数的一般格式如下:
<派生类名>(<总参数表>):<基类名>(<参数表1>),<对象成员名>(<参数表2>)
{
<派生类数据成员的初始化>
}
即对应代码中的:
Student(string name1,int age1,string sex1,string sno1,double score1):Person(name1,age1,sex1) -
如果派生类中有子对象,还应包括子对象初始化的参数。
-
派生类构造函数的调用顺序是: 首先调用基类的构造函数,再调用对象成员类的构造函数(如果有对象成员),最后调用派生类自己的构造函数。
#include <iostream>
#include <cstring>
using namespace std;
class Person{
private:
string name;
int age;
string sex;
public:
//基类构造函数
Person(string name1,int age1,string sex1)
{
name=name1;
age=age1;
sex=sex1;
}
void print()
{
cout<<name<<'\t'<<age<<'\t'<<sex<<'\t';
}
};
class Student:private Person{
private:
string sno;
double score;
public:
//派生类构造函数:
//派生类名(总参数列表):基类名(参数列表1)
Student(string name1,int age1,string sex1,string sno1,double score1):Person(name1,age1,sex1)
{
sno=sno1;
score=score1;
}
void print()
{
Person::print();
cout<<sno<<'\t'<<score<<endl;
}
};
int main()
{
Student student1("pink",25,"男","160101030138",98);
student1.print();
return 0;
}
运行结果:
派生类的析构函数
- 析构函数在对象生存期结束时由编译系统自动调用完成
- 析构函数的调用顺序与构造函数正好相反:先调用派生类自己的析构函数,再调用对象成员类的析构函数,最后调用基类的析构函数。
#include <iostream>
#include <cstring>
using namespace std;
class Person{
private:
string name;
int age;
string sex;
public:
Person(string name1,int age1,string sex1)
{
cout<<"调用基类构造函数"<<endl;
name=name1;
age=age1;
sex=sex1;
}
void print()
{
cout<<name<<'\t'<<age<<'\t'<<sex<<'\t';
}
~Person()
{
cout<<"Destruct Person"<<endl;
}
};
class Student:private Person{
private:
string sno;
double score;
public:
Student(string name1,int age1,string sex1,string sno1,double score1):Person(name1,age1,sex1)
{
cout<<"调用派生类构造函数"<<endl;
sno=sno1;
score=score1;
}
void print()
{
Person::print();
cout<<sno<<'\t'<<score<<endl;
}
~Student()
{
cout<<"Destruct Student"<<endl;
}
};
int main()
{
Student student1("pink",25,"男","160101030138",98);
student1.print();
return 0;
}
运行结果: