派生
C++中派生类声明的语法:
class 派生类名:继承方式 基类名1,继承方式 基类名2, ……,继承方式 基类名n
{
派生类成员声明;
}
派生类的生成过程:
1.吸收基类成员,但不包含构造函数和析构函数
2.改造基类成员,一是通过继承方式来控制,而是隐藏基类成员变量和成员函数,比如在派生类中声明一个与基类成员同名的成员,这时在派生类中或者在派生类对象中使用该成员名,就只能使用派生类中声明的同名成员。
3.增加新成员
class Student1: public Student //声明基类是Student
{
public:
void display_1( ) //新增加的成员函数
{
cout<<"age: "<<age<<endl;
cout<<"address: "<<addr<<endl;
}
private:
int age; //新增加的数据成员
string addr; //新增加的数据成员
};
class Student1: public Student
在class后面的Student1是新建的类名,冒号后面的Student表示是已声明的基类。在Student之前有一关键宇public,用来表示基类Student中的成员在派生类Studeml中的继承方式。基类名前面有public的称为“公用继承(public inheritance)”。
类一旦被创建,C++编译器会为其产生四个缺省函数,默认的无参构造函数,默认的拷贝构造函数,默认的析构函数,默认的赋值函数。
同名覆盖与重写:
产生原因:派生类定义的成员与基类中的成员同名
如果是函数的话,函数名和参数完全相同
结果:派生类的成员覆盖了基类的同名成员
具体来数,直接使用派生类对象调用成员时,只能调到派生类自己的,而无法访问基类成员
如果要访问基类被覆盖的成员,则需要加上 类名::成员 访问
using namespace std;
class Base
{
public:
void a()
{
cout<<"调用基类的成员函数"<<endl;
}
};
class Derived:public Base
{
public:
void a()
{
cout<<"调用派生类的成员函数"<<endl;
}
};
void main()
{
Derived d;
d.a(); //调用的是派生类的成员函数,这时会覆盖基类的成员函数
d.Base::a();//调用基类的成员函数
d.Derived::a();//调用派生类的成员函数
system("pause");