Polymorphism in C(用C实现多态)

polymorphism in c++ 原书的6,7章,关注怎样利用多态构建应用程序的框架,对于想进阶的朋友比较大的帮助  立即下载

最近一直喜欢浏览国外网站,感觉收获很多,所以我跟苞谷说,看中文网站是无奇不有,看外文网站才知道世界之大.Polymorphism in C是我摘抄+修改+体会+翻译过来的好东东.有助于理解多态.

  多态是什么?就是我们调用一个公共接口(相同函数名字)时,根据调用者的类型调用不同的函数,看过我之前写的C++向C的转化的人其实知道,函数名字相同只是我们肉眼看见的相同,编译器优化后,意味函数所属的class不一样,函数名字也要变化,显然函数的入口地址都是不一样的.C++中的RTTI和dynamic binding就是做这个事情.当然C也可以实现,C是C++的鼻祖嘛.
  这个图中的Structs就是相当于一个class,所有有个class-like,然后每个structs里面有一个公共方法method,这个公共方法就在Common Interface里面,调用者调用这个method不用管它能否调到它想要的那个method,在C++中,可以让你的类型同你这个method绑定在一起,所以很方便,调用者直接call这个method就能call到你想用的那个方法.
  其实多态就是函数指针实现的,因为C也有指针,C也可以做到.
/*file:Poly.h*/
#ifndef _POLY_H                                                                                       
#define _POLY_H                                                                                      
        struct POLY_STRUCT                                                                       
        {                                                                                                         
        void (*poly)( );    // 多态函数,common interface                            
        };
        /* 初始化一个类(相当于),然后把这个公共函数的具体实现跟类型绑一起 */
        struct POLY_STRUCT *InitPoly( void (*poly)() );

        /* 释放一个类(相当于析构函数)*/
        void DestroyPoly( struct POLY_STRUCT *poly );
#endif
/*file:Poly.c*/
struct POLY_STRUCT *InitPoly( void (*poly)() )
{
 struct POLY_STRUCT *result = (struct POLY_STRUCT*)
                                  malloc( sizeof( struct POLY_STRUCT ) );
 if(result != NULL)
  result->poly = poly;
 return result;
}
void DestroyPoly( struct POLY_STRUCT *poly ){ if(poly != NULL) free(poly); }
/*file:main.c*/
/*下面是两个用父类指针表示的两个子类对象*/
struct POLY_STRUCT* example_poly1;
struct POLY_STRUCT* example_poly2;
/*定义两个函数,代表这两个子类中common interface的不同实现*/
void poly_example1_method(){printf("EXAMPLE1/n");}
void poly_example2_method(){printf("EXAMPLE2/n");}
int main(int argc, char *argv[])
{
    example_poly1 = InitPoly(poly_example1_method);
    example_poly2 = InitPoly(poly_example2_method);    

    /*父类指针调用相同的函数,但是结果呢?不一样*/
    (*(example_poly1->poly))();
    (*(example_poly2->poly))();

    DestroyPoly(example_poly1);
    DestroyPoly(example_poly2);
  system("PAUSE"); 
  return 0;
}

结果:
EXAMPLE1
EXAMPLE2
结论就是,函数指针导致了多态,它付出的代价就是程序机制的复杂性和不必要的代码开销,它的优点就是,将俗点就是呈现一致的函数名给我们(实际上编译时这个名字还是要变化),因为一致性,所以重用性和扩展性也更好了.
我喜欢那句话:优化性和可扩展性需要我们去平衡.这里也是.

《Polymorphism in C++ 》( 多型与虚拟).rar Polymorphism in C++ _ 多型与虚拟_.rar<br>候老力作 推荐<br>“在语法粗具的基础上,直接把读者导引到最核心最重要的思想,并且 在建立这个思想的过程中,提供足够的必要基础。<br><br>” 立即下载

相关推荐

Polymorphism in C++ _ 多型与虚拟_

Polymorphism in C++ _ 多型与虚拟_

C++ 中的多态性 (polymorphism) - Polymorphism in C++

C++ 中的多态性 (polymorphism) - Polymorphism in C++ ->Function Overloading (函数重载) ->编译时多态 (Compile time Polymorphism)-> ->Operator Over

程永强 1722

保姆级教程:在Ubuntu 22.04上用Conda搞定nuPlan数据集环境(Python 3.9 + PyTorch)

本文提供了一份详细的Ubuntu 22.04环境下使用Conda配置nuPlan自动驾驶数据集的保姆级教程,涵盖Python 3.9安装、Conda环境管理、PyTorch配置及数据集可视化验证等关键步骤,帮助开发者高效搭建开发环境。

weixin_29061997的博客 254

How to implement Polymorphism in C

I think the article on this website is a good example.http://www.codeproject.com/KB/recipes/PolymorphismC.aspx 

叶落潇湘的专栏 477

利用netmq在相机应用于unity之间传输图像数据

Unity工业相机接入方案解析 本文探讨了在Unity中接入不同品牌工业相机的技术方案。研究发现: Basler相机可直接调用官方DLL(pylonc.net.dll)实现接入 海康和大恒相机因驱动DLL依赖C++组件,无法直接调用 解决方案:通过独立进程(相机应用程序)与Unity进行通信,采用NetMQ实现图像数据传输 技术实现要点: 相机端:使用PublisherSocket发布JPEG图像帧 Unity端:通过SubscriberSocket订阅图像数据 优化:设置高水位线控制缓存帧数,避免数据堆积

weixin_46450859的博客 417

从AAAI 2025被拒到ACM MM 2025录用:我的论文投稿经验与教训总结

本文分享了作者从AAAI 2025被拒到ACM MM 2025录用的论文投稿经验与教训。详细解析了格式要求、可复现性清单等关键细节,提供了精准转投策略和提升录用概率的实用技巧,帮助研究者避免常见错误并优化投稿策略。

weixin_29207533的博客 502

C语言实现多态 (polymorphism)

使用多态,后期扩展功能,不用修改上层策略代码,只需要补充底层模块代码。依赖倒置效果。 * shape.h #ifndef shape_h #define shape_h typedef short int16_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; struct ShapeVtbl; type...

fareast_mzh的博客 1255

华为主题包HWT从入门到排障:下载、导入、修改与兼容性指南

手机主题是很多用户个性化设备的起点,华为手机的主题文件以HWT格式封装,本质上是一种结构特殊的ZIP压缩包,内部包含壁纸、图标、字体和XML配置。了解HWT的目录结构与系统版本兼容性,能帮助用户避开导入失败、秒回默认等常见问题。本文从HWT的基本原理讲起,梳理了安全下载渠道、三种导入方式、应用失败的系统性排查思路,并介绍了解包修改壁纸与字体的方法。无论是普通用户还是进阶玩家,掌握这些技术细节都能更从容地在EMUI与HarmonyOS环境下管理自己的主题资源。

weixin_31155097的博客 352

C++多态(Polymorphism)

1.多态的构成条件多态是⼀个继承关系的下的类对象,去调用同⼀函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象优惠买票。必须指针或者引用调用虚函数被调用的函数必须是虚函数。说明:要实现多态效果,第⼀必须是基类的指针或引用,因为只有基类的指针或引用才能既指向派生类对象;第⼆派生类必须对基类的虚函数重写/覆盖,重写或者覆盖了,派生类才能有不同的函数,多态的不同形态效果才能达到。2.虚函数。

TU^的博客 1674

CrossOver实战:在Mac上流畅运行《梦幻西游》端游与搬砖指南

在跨平台应用开发与系统兼容性领域,如何让为特定操作系统设计的软件在其他平台上运行,是一个经典的技术挑战。其核心原理在于通过兼容层或转译技术,将程序的系统调用和图形接口指令实时转换为目标系统能理解的格式。这项技术的价值在于极大地扩展了硬件设备的软件生态,让用户无需依赖虚拟机或双系统即可无缝使用关键应用。在游戏、专业工具等场景中,这能显著提升工作效率和用户体验。本文以经典端游《梦幻西游》为例,详细解析如何在搭载Apple Silicon或Intel芯片的Mac上,借助CrossOver这一成熟的兼容层方案,构建

weixin_30129025的博客 558

OOP 三大特征之多态(Polymorphism)

OOP三大特性最重要的:多态。 很多程序员虽然在用支持OOP的语言,但却从未用过多态。 只使用封装、继承的编程方式,称为基于对象(Object Based)编程 只有加入多态,才能称为OOP 没写过多态,就是没写过OO代码。 正是有了多态,软件设计才有更大弹性,更好拥抱变化。 如何理解多态? 多态,即一个接口,多种形态。 一个draw方法,以正方形调用,则画正方形;以圆形调用,则画圆形: 继承的两种方式之一的实现继承,请尽可能用组合替代。而接口继承,主要是给多态用的。 因为重点在于继承体系的使用者,主

JavaEdge全是干货的技术号 3597

【Autoware】2小时安装Autoware1.13(保姆级教程)

Autoware是一款“一体化”开源自动驾驶软件,能实现感知、决策、控制等功能,通过在Ubuntu中搭建Autoware开发环境和案例的运行,使大家对自动驾驶技术的实现有一个更清晰的认识。

DevFrank的博客 1万+

多态_polymorphism

自定义数据类型的转换,主要指类类型与其它数据类型之间的转换。(1)在C++中,把其它数据类型转换成类对象是通过转换构造函数来完成的,前提是此类的转换构造函数只带1个非缺省参数。(2)把类对象转换成其它数据类型是通过类型转换函数来完成的。类型转换函数又称为类型强制转换成员函数或转换运算符函数,他是类中的一个非静态成员函数。需要注意的是类型转换函数不能有返回值,不带任何参数,也不可以将类型转换函数定义为友元函数。classpublic:operator();

bliu2_10的博客 853

YOLOv8_obb训练流程-原理解析[旋转目标检测理论篇]

本文主要介绍了YOLOv8旋转目标检测的流程,介绍了标签的解码、预测结果的解码,以及如何理解旋转角度等内容,还介绍旋转目标检测框的正样本选取及Loss计算。

ice 4731

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

多态(polymorphism),覆盖(Override),重载(overload)

多态(polymorphism) 覆盖(Override) 重载(overload) 也有把override译为重载的。 关于override和overload的翻译,好像不是很统一。 更多的应该是: 覆盖(override)和重载(overload) 1。 覆盖 override: Overriding 也许叫做overwriting更合适, OVERLOAD覆盖是指在子类(c++中的派生类)

Ruby语言 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

多态(Polymorphism)

OOP的三个基本特征:封装,继承和多态,而且最重要的一个是多态,于是从一开始我一直认为多态是只有OOP语言才有的特征,这在C++和Java中表现很明显,虽然也看到过一些文章说很多过程性语言也有这个特性,例如C,但还是很少见到,最近有机会接触一些其它类型的语言,发现多态真的具有普遍性,只要理解多态的本质,在设计程序的时候有多态的思想,大部分的语言都提供了实现多态的技术,只是有的复杂,有的简单;有的明

geroma的专栏 407

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C++进阶-->多态(Polymorphism)

多态、虚函数、还有多态的底层讲解

2301_80475151的博客 1347

C++ 中的虚函数和运行时多态 (polymorphism) - Virtual Functions and Runtime Polymorphism in C++

C++ 中的虚函数和运行时多态 (polymorphism) - Virtual Functions and Runtime Polymorphism in C++ The main thing to note about the program is that the derived class’s function is called using a base class pointer. 有关该程序的主要注意事项是使用基类指针调用派生类的函数。 The idea is that virtual fun

程永强 848

【C++】多态(polymorphism)

指的是计算机自身彼此关联的过程,在这个过程中确定程序中的操作调用与之前操作的代码段之间的映射关系,比如:函数重载时,编译器会根据函数名和函数的参数来区别要执行的函数(哪一段代码) 这就是建立的一种映射关系,明确函数调用时会执行哪一个代码段。首先,我们需要额外的内存来存储V表,并且基类中要有一个成员指针指向V表,这样我们才能映射到正确的函数。指的是编译阶段不能确定将要调用的函数,只能在程序运行的时候才能确定将要调用的函数。这不是必需的,但你应该这样做。理解为,同一个接口,通过不同的对象调用,就有不同的效果。

qq_45951891的博客 1018

C++的多态(polymorphism)

基本定义:在C++中,多态(polymorphism)是一种面向对象编程(OOP)的特性,允许不同的类(通常是基类和派生类)使用相同的接口进行交互,但表现出不同的行为。

choose_heart的博客 376

31. Python中的多态(Polymorphism)

《Python编程的术与道:Python语言入门》视频课程 《Python编程的术与道:Python语言入门》视频课程链接:https://edu.youkuaiyun.com/course/detail/27845 多态 (Polymorphism) 多态一词意味着具有多种形式(The word polymorphism means having many forms)。 在编程中,多态意味着相同的函数名称(但签名不同)可以用于不同的类型。 函数签名(function signature):包含了一个函数的信息,包括

bai666ai的博客 2515

再谈 C++ 多态(Polymorphism)

文章目录多态的本质使用虚函数的例子:不带继承的多态:C++模板 多态的本质 个人的理解: 多态的本质是让我们得以用一种与类型无关(type-independent)的方式来操作这些类对象。 参考 Essential C++ P137 百度百科:在编程语言和类型论中,多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口。 多态类型(英语:polymorphic type)可以将自身所支持的操作套用到其它类型的值上。 使用虚函数的例子: #include <iostream>

weixin_47652005的博客 658

polymorphism in java_多态(Polymorphism)的实现机制(下)--Java篇

既然多态是面向对象的三大本质特征之一(其它两个是数据抽象和继承),那么C++为什么不将方法调用的默认方式设置为动态绑定,而要通过关键字 virtual进行标记呢?Bruce Eckel在《Thinking in C++》中提到,这是由于历史原因造成的,C++是从C发展而来的,而C程序员最为关心的是性能问题,由于动态绑定比静态绑定多几条指令,性能有所下降, 如果将动态绑定设定为默认方法调用方式,那么...

weixin_27964579的博客 158
上一篇: qsort函数用法
下一篇: Linux下的top命令
lm_123_456
博客等级 码龄11年 35粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值