漫画 | C语言哭了,过年回家,只有我还没对象
C语言回家过年,遇到不少小伙伴。
大家都在外地打拼,一年难得见面,聚到一起吃饭,都非常高兴。


听Java提到TIOBE, 正在喝酒的C语言激动起来。
自己常年在那里排名第二,人类用自己写的程序可真不少!可都是处于底层,在系统级编程,什么操作系统,数据库,编译器......
这些软件与应用层的热闹光景比起来,显得有些落寞。

Python端着酒杯来到C语言身边。


餐桌的气氛突然有点儿尴尬, 捅了篓子的Python赶紧招呼大家继续喝酒。
好不容易熬到聚餐结束,C语言郁闷地回到了冷冷清清的家中。

C语言突然想起来对门的肯·汤普森,那是丹尼斯·里奇的“好基友”,他们俩一起创造了伟大的Unix操作系统,获得了计算机界的最高奖:图灵奖。



看到C语言满脸沮丧, 肯·汤普森大为吃惊!

肯·汤普森立刻明白了,C语言觉得自己不支持面向对象编程。


看到C语言很吃惊,肯·汤普森决定好好给他掰扯掰扯。
他真不愧是老司机,唰唰唰迅速就写成了一段代码。

C语言很聪明,很快看懂了。
这里定义了一个叫做Shape的结构体,外界只能通过相关的函数来对这个Shape进行操作,例如创建(Shape_create), 移动(Shape_move),等,不能直接访问Shape的内部数据结构。
虽然这里没有class这样的关键字,数据结构和相关操作是分开写的,看起来不太完美, 但确实是实现了封装。

肯·汤普森不吭声,继续写代码。
大牛的风格看来都是类似的:别瞎BB,给我上代码。

这次定义了一个矩形(Rectangle)的结构体,其中嵌套了Shape,难道这就实现了继承?
C有点疑惑。

通过这种组合的方式,也算是实现了继承吧。

这么轻松就实现了封装和继承,C语言感到很兴奋, 但是多态怎么实现呢?
这时候外边又传来了门铃声。

Linus大神撇了一眼墙上的代码,立刻就明白了怎么回事。


C和Go都是一脸茫然。

现在C有点明白了, 无论是Rectangle对象,还是Square对象,在调用Shape_area方法的时候, 都需要通过vptr这个指针找到虚函数表中的area方法。
对于Rectangle,找到的是Rectangel_area方法,对于Square,找到的是Square_area方法。
struct Rectangle *r = Rectangle_create(5,5,10,10);
Shape_area((struct Shape *) r);



漫画 | C语言哭了,过年回家,只有我还没对象的更多相关文章
- 对内存分配的理解 自动变量 局部变量 临时变量 外部变量 字符串长度 C语言可以看成由一些列的外部对象构成
Status ListInsert_Sq(SqList *L,int i,LElemType_Sq e) { LElemType_Sq *newbase; LElemType_Sq *p,*q; if ...
- 快乐编程大本营【java语言训练班】 6课:用java的对象和类编程
快乐编程大本营[java语言训练班] 6课:用java的对象和类编程 第1节. 什么是对象和类 第2节. 对象的属性和方法 第3节. 类的继承 第4节. 使用举例:创建类,定义方法,定义属性 第5节. ...
- JavaWeb学习之什么JSP、JSP是如何工作的、JSP语言(各种指令和九大内置对象)、EL表达式简单使用(5)
1.什么JSP * servlet:java编写的处理动态web的技术 * 特点:Java代码中嵌套html代码 * jsp * 特点:HTMl代码中嵌套java代码 * %tomcat%/conf/ ...
- 知名游戏开发者称 C++ 是一种非常糟糕、可怕的语言(C++不是一门可怕的语言,可怕的是一群没有耐心的程序员来使用C++这门语言)
抛出一个问题:C++ 真的很可怕吗? 2016 年底,C++ 之父 Bjarne Stroustrup 在一次采访中表示:”C++ 让编程专家很容易编写出复杂.高性能.低资源消耗的代码,但不足以成为广 ...
- C语言/C++编译环境的设置!有的人还没开始就卡住了!
本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器. 文本编辑器 这将用于输入您的程序.文本编辑器包括 Windows Notepad. ...
- 《R语言入门与实践》第五章:对象改值
本章将了如何对一个数据对象中的数据进行改动,分为以下方法: 直接改值 条件取值然后改值 直接改值 单个改值:vec[1] <- 1000多个改值: vec[c(1,3,5)] <- 100 ...
- 《Pyhton语言程序设计》_第7章_对象和类
#7.2.1_定义类 一个类的功能:数据域.定义方法.初始化程序 初始化程序总是被命名为:_ _init_ _ (两个连续的下划线) #7.2.4_self参数 #self参数是指向对象本身的参数,那 ...
- go语言使用go-sciter创建桌面应用(七) view对象常用方法,文件选择,窗口弹出,请求
view对象的详细文档请看: https://sciter.com/docs/content/sciter/View.htm demo9.html代码如下: <!DOCTYPE html> ...
- go语言之进阶篇方法面向过程和对象函数的区别
1.方法 (method) 在面向对象编程中,一个对象其实也就是一个简单的值或者一个变量,在这个对象中会包含一些函数,这种带有接收者的函数,我们称为方法(method). 本质上,一个方法则是一个和特 ...
随机推荐
- Phoenix踩坑填坑记录
Phoenix踩坑填坑记录 Phoenix建表语句 如何添加二级索引 判断某表是否存在 判断索引是否存在 Date类型日期,条件判断 杂项 记录Phoenix开发过程中的填坑记录. 部分原文地址:ph ...
- Tomcat Servlet工作原理
前言 Tomcat的启动过程 Web应用初始化 创建Servlet实例 初始化Servlet 执行service方法 前言 Servlet实际上就是一个java类,只不过可以和浏览器进行一些数据的交换 ...
- sudo 配置
在ubuntu中由于禁用了root用户,默认情况下会把安装系统时建立的用户添加到sudoers中. 但在redhat和centos中并没有把任何root用户之外的用户默认的添加到sudoers之中.这 ...
- dedecms后台更新网站栏目无反应的解决方法
dedecms进行第二次模板开发后,遇到在栏目更新的时候没有反应,但是用回原来的初始模板就可以,百度查找了很多的教程也无法进行解决,就这样慢慢的摸索.终于找到了问题的所在,原因可能是该更新的时候无法获 ...
- idea--忽略隐藏文件、文件夹的设置操作
文章由来 公司同事在群里问了个问题,如下: 为了大家看清,将图特意贴出来: 这人还删除idae重装了下,哈哈,才到群里问的. 解决思路(按顺序) 1.我让他直接拉会,共享桌面我给看了下,首先是open ...
- 前端html基础学习笔记二
表单 1 : 表单标签 <form></form> 属性 : action = '接口地址' method = 'get / post' name = '表单名称' 2 : 表 ...
- Pytest(11)allure报告
前言 allure是一个report框架,支持java的Junit/testng等框架,当然也可以支持python的pytest框架,也可以集成到Jenkins上展示高大上的报告界面. mac环境: ...
- 各个复位标志解析,让我们对MCU的程序的健康更有把控
作者:良知犹存 转载授权以及围观:欢迎添加微信公众号:Conscience_Remains 总述 曾经开发的时候遇到这样情况,我们开发的设备需要长时间工作上报信息,但是我们在后台查看上报数据,发现设备 ...
- HDFS查看文件的前几行-后几行-行数
随机返回指定行数的样本数据hadoop fs -cat /test/gonganbu/scene_analysis_suggestion/* | shuf -n 5返回前几行的样本数据hadoop f ...
- xls与csv文件的区别
CSV是文本文件,用记事本就能打开.XLS 是二进制的文件只有用 EXCEL 才能打开:CSV 文件格式只能保存活动工作表中的单元格所显示的文本和数值.XLS 中所有的数据行和字符都将保存.数据列以逗 ...