继承的概念
现实世界中,继承是事物之间的一种重要关系,例如自然界存在各种各样的动物,动物作为一个总类又可划分为脊椎动物、无脊椎动物两个分类,日常生活中常见的猫、狗等小动物属于脊椎动物中的哺乳动物类,青蛙属于两栖动物,各种动物之间形成了一种继承关系,接下来通过一幅图来描述这种继承关系,如图1所示。
图1 动物继承关系图
继承是事物发展的过程,通过继承使后代继承了父辈的优秀属性并进一步扩展出新的属性和能力。C++中,继承就是在现有类的基础上建立新类,即新类从已有类中得到属性和行为,并可以在新类中添加新的属性及方法,新构建的类称为子类或派生类,现有类称为父类或基类。基类和派生类中成员的关系如图2所示。
图2 基类和派生类中的成员
在C++中,派生类的定义形式如下所示:
class 派生类名称:继承方式 基类1名称, 继承方式 基类2名称,…,继承方式 基类n名称
{
派生类成员声明
};
从上述形式看出,派生类的定义方法与普通类基本相同,只需要在派生类名后添加冒号“:”和继承方式及基类名称。若派生类只继承自一个基类则冒号后只列出一个基类名称,这种继承方式称为单继承,若继承自多个类,则冒号后依次列出各个基类,这种方式也被称为多继承。
为了加深读者的理解,接下来举例说明继承的作用。首先,定义一个学生类,用于描述学生信息,示例代码如下所示:
class Student
{
public:
void display()
{
cout << "id: " << m_nID << ", name: " << m_strName
<< ",age: " << m_nAge << endl;
}
private:
int m_nID;
string m_strName;
int m_nAge;;
};
然后,定义一个大学生类,用于描述大学生信息。其中,大学生类是在学生类的基础上增加了“专业”属性,代码如下所示:
class CollegeStudent:public Student
{
public:
string get_major()
{
return m_strMajor;
}
private:
string m_strMajor;
};
从上述代码看出,利用继承机制,大学生类具有基类的所有属性,并扩充了新的功能,实现了代码复用。
通过继承,基类中的所有成员被派生类继承,成为派生类成员,在此基础上,派生类还可增加新的成员。接下来通过一个案例说明派生类的定义和使用方法,如例1所示。
例1
1 #include <iostream>
2 #include <string>
3 using namespace std;
4 class Animal //定义Animal类
5 {
6 public:
7 void speak() //成员函数
8 {
9 cout << "animal language!" << endl;
10 }
11 };
12 class Cat:public Animal //定义Animal的派生类Cat
13 {
14 public:
15 Cat(string con_name):m_strName(con_name){} //构造函数
16 void print_name() //成员函数,显示猫的名称
17 {
18 cout << "cat name: " << m_strName << endl;
19 }
20 private:
21 string m_strName; //数据成员,记录猫名称
22 };
23 int main()
24 {
25 Cat cat("Persian"); //定义派生类对象
26 cat.print_name();
27 cat.speak(); //派生类对象使用基类成员函数
28 system("pause");
29 return 0;
30 }
程序运行结果如图3所示。
图3 例1运行结果
在例1中,Cat类继承自Animal类,继承方式是public公有继承。从运行结果看出,虽然派生类中没有定义speak()成员函数,但却能够调用该函数,这说明派生类继承了基类的属性和方法。继承方式规定了派生类对基类成员的使用方法,具体内容将在下一节说明。
根据Cat类对Animal类的继承关系,可以描绘出派生类中的成员构成,如图4所示。
图4 基类Animal和派生类Cat继承关系图
现在,读者已经掌握了继承的基本方法,在类的继承中还有几点需要注意的地方,具体如下:
1、 基类的构造函数和析构函数不可被继承。
2、 派生类继承了基类的全部数据成员和除了构造、析构函数之外的所有成员函数。派生类对于基类成员的继承是没有选择的,不能选择接收或舍弃基类中的某些成员。
3、 派生类中除了与基类同名的成员外还可以添加新成员,用于实现新功能,保证了派生类的功能在基类基础上的发展。
4、 多个派生类可以继承自一个基类,示例代码如下所示:
class A{……};
class B:public A{……}; //类B继承自类A
class C:public A{……}; //类C继承自类A
5、 C++中可以通过派生形成类的层次结构,即一个基类可以是另一个更高层次类的派生类,而另一个派生类也可以继续产生派生类,示例代码如下所示:
class A{……};
class B:public A{……}; //类B是类A的派生类
class C:public B{……}; //类C是类B的派生类