1:继承是面向对象的主要特征(此外还有封装和多态)之一,它使得一个类可以从现有类中派生,而不必重新定义一个新类。继承的实质就是用已有的数据类型创建新的数据类型,并保留已有数据类型的特点,以旧类为基础创建新类,新类包含了旧类的数据成员和成员函数,并且可以在新类中添加新的数据成员和成员函数。旧类被称为基类或父类,新类被称为派生类或子类。
2:类的继承形式如下:
class 派生类名称标识符:[继承方式] 基类名称标识符
{
[访问控制修饰符:]
[ 成员声明列表]
}
继承方式有3中派生类型,分别为共有型(public)、保护型(protected)和私有型(privated),访问控制修饰符也是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、员工姓名等信息直接从员工类中继承得到。
3:例子代码如下:
// 8.1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> using namespace std; class CEmployee //定义员工类 { public:int m_ID; //定义员工IDchar m_Name[128]; //定义员工姓名char m_Depart[128]; //定义所属部门CEmployee() //定义默认构造函数 {memset(m_Name,0,128); //初始化m_Name//注意这种用法,可以随意设置名字和部门memset(m_Depart,0,128); //初始化m_Depart }void OutputName() //定义共有成员函数 {cout <<"员工姓名"<<m_Name<<endl; //输出员工姓名 } }; class COperator :public CEmployee //定义一个操作员类,从CEmployee类派生而来 { public:char m_Password[128]; //定义密码bool Login() //定义登录成员函数 {if (strcmp(m_Name,"MR")==0 && //比较用户名。比较两个字符串,设这两个字符串为str1,str2,若str1==str2,则返回零;若str1>str2,则返回正数;若str1<str2,则返回负数。strcmp(m_Password,"KJ")==0) //比较密码 {cout<<"登录成功!"<<endl; //输出信息return true; //设置返回值 }else{cout<<"登录失败!"<<endl; //输出信息return false; //设置返回值 }} }; int main(int argc, char* argv[]) {COperator optr; //定义一个COperator类对象strcpy(optr.m_Name,"MR"); //访问基类的m_Name成员strcpy(optr.m_Password,"KJ"); //访问m_Password成员optr.Login(); //调用COperator类的Login成员函数optr.OutputName(); //调用基类CEmployee的OutputName成员函数return 0; }
运行结果:
程序中,CEmployee类是COperator类的基类,也就是父类。COperator类将继承CEmployee的所有非私有成员(private类成员不能被继承)。
用户在父类中派生子类时,可能存在一种情况,即在子类中定义了一个与父类同名的成员函数,此时称为子类隐藏了父类的成员函数。