C++的虚函数,动态(运行期)多态性是不是一个多此一举的不必要的设计?

renxu350 2010-10-16 12:08:04
1. C++的设计者为什么要设计运行期多态性?既然"对象.类::成员函数()"这个形式能解决问题,C++的设计者为什么要设计一个多此一举的运行期多态性?

2. 运行期多态性似乎是一种“假动态”,众所周知,非虚函数的调用指令,在程序被编译链接后,其调用指令包含一个链接器链接的“常量”地址,该“常量”地址就是此非虚函数的静态地址,这是所谓的静态的编译期的多态性,而动态的运行期多态性就真的是动态的吗?所谓的运行期多态性,无非就是在类的对象被构造时,编译链接器,或者装载器为对象构造一个虚函数表指针成员变量,此指针成员变量对外不可访问,此指针指向此对象的类族的虚函数表,而虚函数表中的一个个的虚函数实质上还是一个个静态的地址,只不过是通过一个中间指针,间接的调用,这样就变成动态的?这是一种假动态?

3. 在实际的社会生产生活应用中,有没有什么实际的例子,实际的问题,必须不得不由虚函数出马来解决才能完成,而"对象.类::成员函数()"这样的形式是完成不了的实际的问题呢?大家有没有遇到过这样的问题呢?
...全文
142 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wltg2001 2010-10-16
  • 打赏
  • 举报
回复
在实际的社会生产生活应用中,有没有什么实际的例子,实际的问题,必须不得不由虚函数出马来解决才能完成,而"对象.类::成员函数()"这样的形式是完成不了的实际的问题呢?大家有没有遇到过这样的问题呢?
==============
前面的就不说了,只说这一个吧。举一个例子,你现在有一个图形类,有三个子类,分别是圆形,三角形和矩形。在一次显示过程中,有很多个这三个类的对象。为了方便处理,一般这些对象都是放在一个队列中的。如果没有虚函数,你如何方便地调用这三个类的DisPlay函数来显示它们呢?
modyaj 2010-10-16
  • 打赏
  • 举报
回复
自然是有它自己的用处才出现的
zhouzhipen 2010-10-16
  • 打赏
  • 举报
回复
用到了就有用,没用到就是垃圾!
Sou2012 2010-10-16
  • 打赏
  • 举报
回复
你可以发邮件问一下 C++ 之父 Bjarne Stroustrup。
Sou2012 2010-10-16
  • 打赏
  • 举报
回复
你可以问一下 C++ 之父 Bjarne Stroustrup。
renxu350 2010-10-16
  • 打赏
  • 举报
回复
请大家到这个贴子来讨论:

http://topic.csdn.net/u/20101016/00/a7e0e9f1-7799-4a35-ac86-1be1e1739d17.html?59687
teleinfor 2010-10-16
  • 打赏
  • 举报
回复
运行时多态是面向程序设计的基础,当然这个是对c++而言的。多态性不光是采用虚函数才能实现,通过模板或者void指针也可以实现多态,但是不可否认virtual带来的多态对于面向对象编程有着不可替代的意义。大家通常所言的面向对象编程或者面向接口编程,所需要的技术支撑正是由virtual实现的。java中有所谓的接口、抽象类等,那么对于c++而言就是virtual了。
xwsn007 2010-10-16
  • 打赏
  • 举报
回复
对象.类::成员函数()这种形式的代码能封装变化么,代码岂不是写死了,楼主可以找些多态应用的代码研究一下:什么是通过接口编程(这里的接口泛指“基类指针,抽象基类”等等能封装子类的扩展和变化的东东)
傻X 2010-10-16
  • 打赏
  • 举报
回复
楼主提出这个问题,说明楼主确实在思考啊."对象.类::成员函数()"确实能解决很多问题.这也说明了楼主编程经验尚短.5楼举的例子,是老师上课一直讲的.虚函数所带来的方便不仅仅在于此.举个例子:我之前在开发一个传感器的接口,这种传感器类型是非常多,通常处理不同的情况都是switch,根据传感器的编号处理,但是随着发展传感器的类型会渐渐增多.要不停的去改源代码.这就非常麻烦了.用虚函数定义这么一个玩样.以后传感器多了,多写这样一个函数体去实现就够了.楼主可以去看下设计模式方面的书籍
  • 打赏
  • 举报
回复
看看楼上说的。没有运行时的多态你怎么实现?全在父类里写代码绘制不同的图形?那要类这个概念还有什么用?还要面向对象这个概念有什么用?直接把所有可能用到得代码都写在cobject里得了,且不说能不能实现,就是实现了数十万行的代码你怎么看?能看得明白么?面向对象是有他的问题,但我想作为4gl能被那么多人接受自然就是合理的。
还有动态也好静态也好就是个称呼,只不过是为了和重载有个区分,没必要扣字,要我说我的电脑就呆在那没动,他里面的软件怎么动硬件动我都不知道,我就说他是静态的怎么了。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧