因为派生类不能继承基类的构造函数,所以必须定义自己的构造函数。并且派生类拥有自己的数据成员,因此,派生类的构造函数除了需要对自己的数据成员进行初始化外,还必须调用基类的构造函数初始化基类的数据成员。这种调用过程是编译系统自动完成的。若基类函数需要一些形参,派生类构造函数必须要传相应的参数给基类构造函数,否则编译会出现错误。
派生类构造函数的一般格式如下:
<派生类名>(<总参数表>):<基类名>(<参数表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;
}
运行结果:
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- shangjiatang.cn 版权所有 湘ICP备2022005869号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务