c++多态实现

kukiius 2015-12-11 03:39:07
加精
c++的多态实现是用虚函数表,可不可以换个实现方式:在有虚函数的对象中加一个字符串指针,初始化时保存一个该类的标识,在使用父类指针调用函数时,直接将该父类指针转换为该标识表示的类指针,然后调用函数?
...全文
2497 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZHHQ204 2015-12-29
  • 打赏
  • 举报
回复
直接敲代码,更好
Mr.Brain 2015-12-25
  • 打赏
  • 举报
回复
mfc里有这个实现,是一组宏。不用自己写
张小飞Official 2015-12-18
  • 打赏
  • 举报
回复
引用 22 楼 FreeFice 的回复:
不要把虚函数看得有多复杂,其实其仅仅表示为一个接口,当且仅当派生类没有提供实现时,采用基类默认的操作方式(纯虚函数除外)。你当然可以将不同的派生类冠以不同的前缀,这是C的处理方法,不是不可以,而是在C++里完全没这个必要,因为这样做反而更耗资源,不仅书写麻烦而且还容易出错。
感觉还是题主没有学精c++的精髓,我觉得如果有一个想法,可以去找找c++有没有这个特性然后再去做,这样会有事半功倍的效果
Heart09 2015-12-18
  • 打赏
  • 举报
回复
引用 25 楼 FreeFice 的回复:
[quote=引用 23 楼 henuyx 的回复:] 回答:可以的,而且你的想法很好!而且把你说的那个string改成int类型,岂不是更好。 不过我还有更好的办法,不用c++,用c,然后不用多态,针对每种结构体都写一个对应的函数,然后设计一个命令 类型,每次switch,是哪种类型就调用对应的函数。速度绝对快。 可是,你会这么做吗?
在C语言里处理这种方法有必要这么复杂吗?你可以建立一个结构:命令类型、命令标识、函数指针;将对应的处理传递这个结构指针,这样,你根本就不需要去判断,直接就可以调用指针函数操作,而且你还可以在应用外面通过消息确定命令标识的方式调用相应的函数,从而实现函数独立化,可以根据需要多方触发。关键是还可替换,可以实现在线式程序升级。 但是,作为C++编程人员,你不觉得总是抱持C的观点,无助于更好的运用C++强大的整合能力吗?[/quote] 真逗
庄鱼 2015-12-17
  • 打赏
  • 举报
回复
引用 23 楼 henuyx 的回复:
回答:可以的,而且你的想法很好!而且把你说的那个string改成int类型,岂不是更好。 不过我还有更好的办法,不用c++,用c,然后不用多态,针对每种结构体都写一个对应的函数,然后设计一个命令 类型,每次switch,是哪种类型就调用对应的函数。速度绝对快。 可是,你会这么做吗?
在C语言里处理这种方法有必要这么复杂吗?你可以建立一个结构:命令类型、命令标识、函数指针;将对应的处理传递这个结构指针,这样,你根本就不需要去判断,直接就可以调用指针函数操作,而且你还可以在应用外面通过消息确定命令标识的方式调用相应的函数,从而实现函数独立化,可以根据需要多方触发。关键是还可替换,可以实现在线式程序升级。 但是,作为C++编程人员,你不觉得总是抱持C的观点,无助于更好的运用C++强大的整合能力吗?
s_xiaomihu 2015-12-17
  • 打赏
  • 举报
回复
学习
Heart09 2015-12-17
  • 打赏
  • 举报
回复
回答:可以的,而且你的想法很好!而且把你说的那个string改成int类型,岂不是更好。 不过我还有更好的办法,不用c++,用c,然后不用多态,针对每种结构体都写一个对应的函数,然后设计一个命令 类型,每次switch,是哪种类型就调用对应的函数。速度绝对快。 可是,你会这么做吗?
blueink_200451 2015-12-15
  • 打赏
  • 举报
回复
C++太复杂了。哈哈。
庄鱼 2015-12-15
  • 打赏
  • 举报
回复
不要把虚函数看得有多复杂,其实其仅仅表示为一个接口,当且仅当派生类没有提供实现时,采用基类默认的操作方式(纯虚函数除外)。你当然可以将不同的派生类冠以不同的前缀,这是C的处理方法,不是不可以,而是在C++里完全没这个必要,因为这样做反而更耗资源,不仅书写麻烦而且还容易出错。
浪尖的猪 2015-12-15
  • 打赏
  • 举报
回复
kankan/////////
xiaoxiangqing 2015-12-14
  • 打赏
  • 举报
回复
这些都是牛人设计出来的,有好的方法,不早就用上了。
qingnlo 2015-12-13
  • 打赏
  • 举报
回复
虚函数可以用全局函数实现,其实所有的成员函数理论上就是全局函数。
qwer_boo 2015-12-13
  • 打赏
  • 举报
回复
好久没有来C/C++版块了,堕落了
kukiius 2015-12-12
  • 打赏
  • 举报
回复
引用 13 楼 kuki_iu 的回复:
[quote=引用 10 楼 paschen 的回复:] 那你得在子类的构造函数中自己加上代码修改这个标识,同时还会遇到一些其他问题,如多重继承等
那你得在子类的构造函数中自己加上代码修改这个标识:这一步可以由编译器在创建对象时候自己创建标志,以后都不用改。 同时还会遇到一些其他问题,如多重继承等:能举个例子吗?[/quote] 说错了:是编译器在解析一个类时候可以为该类分配一个标志,在创建对象时候编译器只需要自动创建一个指针指向这个标志就行,以后都不需要改。
kukiius 2015-12-12
  • 打赏
  • 举报
回复
引用 10 楼 paschen 的回复:
那你得在子类的构造函数中自己加上代码修改这个标识,同时还会遇到一些其他问题,如多重继承等
那你得在子类的构造函数中自己加上代码修改这个标识:这一步可以由编译器在创建对象时候自己创建标志,以后都不用改。 同时还会遇到一些其他问题,如多重继承等:能举个例子吗?
lm_whales 2015-12-12
  • 打赏
  • 举报
回复
引用 11 楼 lm_whales 的回复:
。。。。。。。。。。。 指针赋值也不需要开销 。。。。。。。。 每个函数名,编译器安排一个索引号,查找时候,按号查找,很方便。
指针赋值也不需要太多额外开销 每个函数名以及他的不同形式 ,编译器各安排一个索引号,查找时候,按号查找,很方便。
lm_whales 2015-12-12
  • 打赏
  • 举报
回复
虚函数表开销很小 1)全局区域(静态区)有个虚函数表 2)对象内部有个虚函数表指针 假设1000的对象 20个虚函数 开销也只有1000+20 个指针 指针赋值也不需要开销 如果没有虚拟继承,没有多重继承 派生类和基类指针(和引用)之间的转换也很直接,实际上根本就没有任何变化。 虚函数的调用开销,只有指针重定位,和查找虚函数这么几步, 此外也就是对象构造和析构,也需要调整虚函数表,对象复制多复制一个指针 虚函数表,实际上是数组,所以查找不过是查表而已 每个函数名,编译器安排一个索引号,查找时候,按号查找,很方便。 在C,C++这种高级语言级别,要实现这种方式,调用函数,很麻烦 但是汇编语言,机器语言级别,这种方法其实非常简单 这样,编译器,把各种复杂情况,分析好,安排好 汇编或者机器语言级别实现,那是完全没难度 高效而又简单。 所以虚函数表实现,其实是最简单,最直接,最高效的实现方式。
paschen 版主 2015-12-12
  • 打赏
  • 举报
回复
楼主应该先看下《深入探索C++对象模型》这本书,就知虚表没你想的那么简单了,要考虑很多东西
paschen 版主 2015-12-12
  • 打赏
  • 举报
回复
那你得在子类的构造函数中自己加上代码修改这个标识,同时还会遇到一些其他问题,如多重继承等
qq_31557027 2015-12-12
  • 打赏
  • 举报
回复
虚函数可以用全局函数实现,其实所有的成员函数理论上就是全局函数。
加载更多回复(9)

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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