C++类的继承与多态
C++ 是一种中级语言,它进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言。C++ 可运行于多种平台上,如 Windows、MAC 操作系统以及 UNIX 的各种版本。一些基本的知识,你们的学长已经讲过了,今天我来向你们简单介绍一下类的继承与多态。
一.继承
1.继承是面向对象程序设计中最重要的一个概念。
2.继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样也达到了重用代码功能和提高执行效率的效果。
3.当创建一个类时,我们不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。
4.继承代表了 is-a 关系。例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物,等等。
对应代码如下:
// 基类
class Animal {
// eat() 函数
// sleep() 函数
};
//派生类
class Dog : public Animal {
// bark() 函数
};
二.基类 & 派生类
一个类可以派生自多个类,也就是说它可以从多个基类继承数据和函数。定义一个派生类,我们使用一个类派生列表来指定基类。类派生列表以一个或多个基类命名,形式如下:
class derived-class: access-specifier base-class
- 访问修饰符 access-specifier 是 public、protected 或 private 其中的一个
- base-class 是之前定义过的某个类的名称。如果未使用访问修饰符 access-specifier,则默认为 private。
三.访问控制&继承
派生类可以访问基类中所有的非私有成员。因此基类成员如果不想被派生类的成员函数访问,则应在基类中声明为 private。
- 不能滥用private!
四.继承类型
- 当一个类派生自基类,该基类可以被继承为 public、protected 或 private 几种类型。
- 我们几乎不使用 protected 或 private 继承,通常使用 public 继承。
使用继承的原则如下:
- 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员来访问。
- 保护继承(protected): 当一个类派生自保护基类时,基类的公有和保护成员将成为派生类的保护成员。
- 私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员
五.多继承
多继承即一个子类可以有多个父类,它继承了多个父类的特性。
C++ 类可以从多个类继承成员,语法如下:
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{
<派生类类体>
};
其中,访问修饰符继承方式是 public、protected 或 private 其中的一个,用来修饰每个基类,各个基类之间用逗号分隔.
引伸拓展:
虚继承——在创建对象的时候创建一个虚表;与类同名的函数是构造函数;~ 类名的是类的析构函数。
六.C++ 多态
多态,顾名思义,多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。
- C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。
- 调用函数 area() 被编译器设置为基类中的版本,这就是静态多态,或静态链接---函数调用在程序执行前就准备好了。有时候这也被称为早绑定,因为 area() 函数在程序编译期间就已经设置好了。
- 此时,我们在area() 的声明前放置关键字 virtual。此时,编译器看的是指针的内容,而不是它的类型。
- 有了多态,我们可以有多个不同的类,都带有同一个名称但具有不同实现的函数,函数的参数甚至可以是相同的。
拓展延伸:
虚函数是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。
我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定。
参考链接:
https://www.runoob.com/cplusplus/cpp-inheritance.htmlhttps://www.runoob.com/cplusplus/cpp-polymorphism.html