《程序员面试宝典》 —— 多态的作用

转载 2015年07月08日 14:18:53

   本文摘抄自《程序员面试宝典(第三版)》117~119页,为了便于自己理解,对某些表述做了修改。

   虚函数就是允许被其子类重新定义的成员函数。而子类重新定义父类虚函数的做法,称为“覆盖”(override),或者称为“重写”,覆盖的函数必须要与被覆盖函数有一致的参数列表和返回值。这里有一个初学者经常混淆的概念,即覆盖(override)和重载(overload)。覆盖是指派生类重新定义基类的虚函数的做法,而重载,是指允许存在多个同名函数,而这些函数的参数表不同(参数个数、参数类型、参数顺序不同,或者某些组合不同)。

   其实,重载的概念并不属于“面向对象编程”,重载的实现是编译器根据函数不同的参数列表,对同名函数的名称做修饰,然后这些同名函数就具有了不同的函数名(至少对于编译器来说是这样的)。如,有两个同名函数func(int p)和func(string p),那么经过编译器的修饰后,这两个函数名可能是int_func和str_func。对于这两个函数的调用,在编译期间就已经确定了,是静态的(记住:是静态)。也就是说,它们的地址在编译期间就绑定了(早绑定)。因此,重载和多态无关,它只是一种语法规则。

   真正与多态相关的是覆盖,父类指针是可以指向子类对象的,当子类重新定义了父类的虚函数后,父类指针根据赋给它的子类对象的不同,动态(注意:是动态)地调用属于子类的函数,这样的调用在编译期间是无法确定的(调用的具体的子类的虚函数地址无法给出),因此,这样的函数地址是在运行时绑定的(晚绑定)。

   结论就是,重载只是一种语言特性,与多态无关,也与面向对象无关。

   引用一句Bruce Eckel的话:“不要犯傻,如果它不是晚绑定,它就不是多态!”

   那么,多态的作用是什么呢?我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类)。它们的目的都是为了代码重用,而多态则是为了实现另一个目的——接口重用。而且系那是往往是,要有效重用代码很难,而真正最具有价值的重用是接口重用,因为“接口是公司最有价值的资源。设计接口比用一堆类来实现这个接口更费时间,而且接口需要耗费更昂贵的人力和时间。”其实,继承为重用代码而存在的理由已经越来越薄弱,因为“组合”可以很好地取代继承的扩展现有代码的功能,而且“组合”的表现更好(至少可以防止“类爆炸”)。因此笔者个人认为,继承的存在很大程度上是作为“多态”的基础而非扩展现有代码的方式。

   多态性是面向对象最重要的特性。

相关文章推荐

24.c/c++程序员面试宝典-多态

24.c/c++程序员面试宝典-多态

多态---程序员面试宝典学习

多态     多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多...

28.c/c++程序员面试宝典-继承时的类作用域

c/c++程序员面试宝典-继承时的类作用域

《Java程序员面试笔试宝典》之Static关键字有哪些作用

static关键字主要有两种作用:第一,只想为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关。第二,希望某个方法或属性与类而不是对象关联在一起,也就是说,在不创建对象的情况下就可以通过...

程序员面试宝典(第三版)——单链表的基本操作:建立,求长度,输出,排序,插入,删除,逆置

总结:单链表的基本操作,包括建立单链表,对单链表求长度,打印输出单链表,对单链表进行排序,删除元素,插入元素,对单链表逆置。这些操作都是程序员必须掌握的,虽然它是一种相对简单的数据结构,但是能够做到熟...

程序员面试笔试宝典——读书笔记6、操作系统基础知识

一、进程管理 1、进程与线程有什么区别 进程是程序关于某个数据集合上的一次运行活动,它是系统进行资源分配和调度的一个独立单位。 线程是进程的一个实体,是CPU 调度和分配的基本单位,线程基本上不拥有系...

程序员面试笔试宝典——读书笔记4、函数、数组、变量

八、函数 1、怎么样写一个接受可变参数的函数 C语言中支持函数调用的参数为变参形式,如printf()函数。实现一个变参函数add(),该函数实现多参数求和运算。代码没附。 2、函数指针...

程序员面试宝典(第四版)——读书笔记-1、第五章:程序设计基本概念

第五章    程序设计基本概念 5.1 赋值语句 x = x & (x-1); count ++; //将 x 转化成二进制后包含的1的数量 5.2 i++ 问...

程序员面试宝典——第五章习题解析

1. P32 面试例题3 以下代码结果是多少#include using namespace std; int func(int x){ int count=0; while(x){ ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)