第12章 多态性
作者:互联网
12.1 What is polymorphism?(什么是多态?)
1.多态性主要分为两大类:
静态(编译时)多态性和动态(运行时)多态性。
2.静态多态性发生在程序被编译的时候,而动态多态性发生在程序运行的时候。
3.C++ 有3 种静态多态性机制:
函数重载(第7 章)、运算符重载(第10 章)、模板(第13 章)
4.通常,哪个函数被调用是在编译时被确定的。
编译器根据调用函数的对象来确定调用哪个函数。
称为静态联编(也可译为静态绑定)或者早期联编。
5.在动态联编或者后期联编中,直到程序运行时才能决定哪个函数被调用。
也就是,根据执行调用的对象确定哪个函数被调用。
6.C++ 使用虚函数来实现动态联编。 虚函数使得多态性在所有情况下都能起作用。
为了清楚起见,最好使用关键字virtual 来声明虚函数,但是在派生类中,关键字virtual是可选的。
12.2.1 When to use virtual functions(使用虚函数时)
使用虚函数会涉及内存和执行时间开销的问题,所以在选择一个基类函数是否声明为虚函数时要慎重考虑。
一般而言,如果一个基类的成员函数可能在派生类中被覆盖,那么就应将其声明为虚函数。
12.2.2 Overriding and overloading(覆盖和重载)
重载是一项编译器技术,用来区分函数名字相同但是参数列表不同的函数。函数重载已在第7 章介绍。
覆盖发生在继承的时候,当派生类的成员函数与基类的成员函数的函数名和参数列表都相同时便会发生覆盖。
12.3 Abstract base classes(抽象基类)
1.包含纯虚函数的基类,称为抽象基类。
2.虚函数:
基类成员函数没有代码,并且被赋值为 0。 virtual void display_details() = 0 ;
用上面这种方式定义的类的成员函数,称为纯虚函数。
纯虚函数只是为了编译器的需要而存在,实际上并不做任何事情。
纯虚函数在所有的派生类中都被覆盖,因此没有必要实现。
3.抽象基类(ABCs)不是用来创建对象的,它们的用途仅仅是作为基类去派生其他的类。
定义一个抽象基类的对象是不可能的,也就是说,抽象基类的对象不能实例化。
虽然一个类层次结构不必包含抽象基类,但在形成类层次结构的第一阶段通常是定义一个抽象基类。
Programming pitfalls(易犯的错误)
1. 虚函数和虚基类很容易让人混淆。虽然它们都是用在继承的环境下,但是实际上它们并没有什么关系。
2. 抽象基类必须至少有一个派生类。定义一个抽象基类的对象将会引发错误。
3. 只有在派生类中的成员函数和基类的成员函数的函数原型相同时,
基类中的这个虚函数才能被派生类中的函数覆盖。
4. 基类中的虚函数能在一个或者多个派生类中被覆盖。只能在基类中声明一个函数为虚函数,派生类中不能定 义虚函数。遗憾的是,这将削弱重用基类的能力,要想重用基类,必须先对其进行修改。
5. 关键字virtual 不能在类声明之外使用。
在定义一个非内联成员函数时,使用关键字virtual是一个很常见的错误。
标签:12,函数,多态性,基类,virtual,抽象,派生类 来源: https://www.cnblogs.com/sparse-shadow/p/16367392.html