文章来源:c++从入门到精通(第四版 清华大学出版社)
目录
继承(inheritance)是面向对象的主要特征(此外还有封装和多态)之一,它使得一个类可以从现有的类中派生,而不必重新定义一个新的类。继承的实质是用已有的数据类型创建新的数据类型,并保留已有数据类型的特点,以旧类为基础创建新类,新类包含了旧类的数据成员和成员函数,并且可以在新类中添加新的数据成员和成员函数。旧类被称为基类或父类,新类被称为派生类或子类。
一.单继承
1.类的继承
class 派生类名标识符:[继承方式] 基类名标识符
{
[访问控制修饰符:]
[成员声明列表]
}
继承方式有三种派生类型,分别为公有(public)型、保护(protected)型和私有(private)型
,访问控制修饰符也是public、protected、private 3种类型。成员声明函数列表中包含类的成员变量和成员函数,是派生类新增的成员。“:”是一个运算符,表示基类和派生类之间的继承关系。
例如,定义一个继承员工类的操作成员类。
定义一个员工类,它包含员工id,员工姓名,所属部门等信息。
class CEmployee{//定义员工类
public:
int m_ID;//id
char m_Name[128];//姓名
char m_Depart[128];//部门
};
定义一个操作员类。通常操作员属于公司的员工,它包含员工ID,员工姓名,所属部门等信息,此外还包含密码信息、登陆方法等。
class COperator:public CEmployee//定义一个操作员类,从CEmployee类派生而来
{
public:
char m_password[128];//定义密码
bool Login();
}
操作员类是从员工类派生的一个新类,新类中增加密码信息、登陆方法等信息,员工id、员工姓名、所属部门等信息直接从员工类中继承得到。
实例1 以公有方式继承
#include<bits/stdc++.h>
using namespace std;
class CEmployee{//定义员工类
public:
int m_ID;//id
char m_name[128];//姓名
char m_Depart[128];//部门
CEmployee()
{
memset(m_name,0,128);//初始化m_name
memset(m_Depart,0,128);
}
void OutputName(){
cout<<"员工姓名:"<<m_name<<endl;
}
};
class COperator:public CEmployee//定义一个操作员类,从CEmployee类派生而来
{
public:
char m_password[128];//定义密码
bool Login(){
if(strcmp(m_name,"Phoebe")==0&&strcmp(m_password,"phoebe12345")==0)
{
cout<<"登陆成功!"<<endl;
return true;
}
else{
cout<<"登录失败!"<<endl;
return false;
}
}
};
int main()
{
COperator optr;
strcpy(optr.m_name,"Phoebe");
strcpy(optr.m_password,"phoebe12345");
optr.Login();
optr.OutputName();
return 0;
}
程序中CEmployee类是COperator类中的基类,也就是父类,COperator类将继承CEmployee类的非私有成员(private类型成员不能被继承)。optr对象初始化m_name和m_password成员后,调用了Login成员函数。
用户在父类中派生子类时,可能存在一种状况,即在子类中定义了一个与父类名相同的成员函数。例如重新定义了一个COperator类,添加一个OutputName成员函数。
2.继承后可访问性
继承方式有public、private、protected 3种,它们的说明如下:
1.公有类派生
公有型派生表示对于基类中的public数据成员和成员函数,在派生类中依然是public;对于基类中的private数据成员和成员函数,在派生类中依然是private。
例如
class CEmployee{
public:
void Output()
{
cout<<m_ID<<endl;
cout<<m_Name<<endl;
cout<<m_Depart<<endl;
}
private:
int m_ID;
char m_Name[128];
char m_Depart[128];
};
class COperator:public CEmployee
{
public:
void Output(){
cout<<m_ID<<endl;//引用基类的私有成员 错误
cout<<m_Name<<endl;//引用基类的私有成员 错误
cout<<m_Depart<<endl;//引用基类的私有成员 错误
cout<<m_Password<<endl;//正确
}
private:
char m_password[128];
bool Login();
}