C++之多态性
Posted inter_peng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++之多态性相关的知识,希望对你有一定的参考价值。
虚函数是指在函数声明前标识为virtual的一种特殊函数。
纯虚函数:在许多情况下,在基类中不能对虚函数给出有意义的实现,而需要把它声明为纯虚函数,它的实现留给该基类的派生类去做,这就是纯虚函数的作用。含有纯虚函数的类叫做抽象类。注意:这种类不能实例化对象,只是作为基类为派生类服务(提供接口)。除非在派生类中将基类定义的所有纯虚函数全部实现,否则,派生类也会变成抽象类,而不能实例化对象。
举个例子,比如基类为几何图形,派生类为正方形,三角形,圆形。如果需要定义一个计算图像面积的函数为:void CalArea()。显然由于基类无法确定图形的类型而无法定义该函数的实现形式,而派生类都有各自不同的面积计算公式。因此,在基类中将该函数定义为纯虚函数:virtual void CalArea()=0,而在派生类中分别定义实现。
虚函数与C++特性(继承、封装和多态性)中的多态性紧密相联。多态性是指相同对象接收到不同消息或不同对象接收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性和运行时多态性。
A: 编译时多态性——通过重载函数实现;(重载——overload)
B: 运行时多态性——通过虚函数机制实现。(重写——overwrite)
(1)什么叫重载函数?360百科:http://baike.so.com/doc/1130916.html
重载函数是函数的一种特殊情况,为方便某一个函数名在多种参数组合下的使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个运算符完成不同的运算功能。注意,如果只有返回值类型不同,而形式参数完全相同的情况,不属于函数重载。
重载函数常用来实现功能类似而所处理的数据类型不同的问题。
C++的这种编程机制给编程者带来极大的方便,不需要为功能相似、参数不同的函数选用不同的函数名,也增强了函数的可读性。
(2)什么是虚函数机制?
虚函数采用一种虚调用的方法。虚调用是一种可以在只有部分信息的情况下工作的机制,特别允许调用一个只知道接口而不知道其准确对象类型的函数。但是,如果要创建一个对象,就必须知道对象的准确类型,因此构造函数不能为虚函数,而析构函数可以是虚函数。这可以保证在任何情况下,不会出现由于析构函数未被调用而导致的内存泄露问题。
虽然虚函数是非常有效的,但是也不能把每个函数都声明为虚函数。因为虚函数是有代价的:由于每个虚函数的对象都必须维护一个虚函数表,因此在使用虚函数时会产生系统开销。如果仅是一个很小的类,且不想派生其他类,那么根本没必要使用虚函数。
(3)C++成员函数的函数重载(overload),覆盖(overwrite):
被重载的特征:
a) 相同的作用域; b)函数名字相同; c)参数不同; d)virtual关键字可有可无。
被覆盖的特征:指派生类覆盖基类函数的实现
a) 不同的作用域(分别位于基类和派生类); b)函数名字相同; c)参数相同; d)基类函数必须有virtual关键字。
如函数 Base::f(int)和函数Base::f(float)是相互重载的关系;函数Base::g(void)被Derived::g(void)覆盖。
以上是关于C++之多态性的主要内容,如果未能解决你的问题,请参考以下文章