漫画 | 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). 本质上,一个方法则是一个和特 ...
随机推荐
- Spark调优 | Spark Streaming 调优
Spark调优 | Spark Streaming 调优 1.数据序列化 2.广播大变量 3.数据处理和接收时的并行度 4.设置合理的批处理间隔 5.内存优化 5.1 内存管理 5.2优化策略 5.3 ...
- (24)bzip2命令:压缩文件(.bz2格式)&&bunzip2命令:bz2格式的解压缩命令
1.bzip2 命令同 gzip 命令类似,只能对文件进行压缩(或解压缩),对于目录只能压缩(或解压缩)该目录及子目录下的所有文件.当执行压缩任务完成后,会生成一个以".bz2"为 ...
- mac外接键盘HOME,END键问题
参考: How to Fix the Home and End Buttons for an External Keyboard in Mac mac老用户应该都知道, MAC自带的键盘的 cmd+左 ...
- hdu 4352 XHXJ's LIS(数位dp+状压)
Problem Description #define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then carefull ...
- poj3580 SuperMemo (Splay+区间内向一个方向移动)
Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 13550 Accepted: 4248 Case Time Limit: ...
- Educational Codeforces Round 86 (Div. 2)
比赛链接:https://codeforces.com/contest/1342 A - Road To Zero 题意 有两个非负整数 x, y 以及两种操作: 支付 a 点代价使其中一个数加一或减 ...
- Educational Codeforces Round 88 (Rated for Div. 2) D、Yet Another Yet Another Task
题意: 给你一个含n个数a1,a2...an的数组,你要找到一个区间[l,r],使得al+a(l+1)+...+a(r-1)+ar减去max(al,a(l+1),...,a(r-1),ar)的值尽可能 ...
- Codeforces Round #646 (Div. 2) C、Game On Leaves
题目链接:C.Game On Leaves 题意: 给你一个n个节点的无根树,你每次可以删除一个叶节点.如果谁先删除x号节点谁就赢了.两个人轮流操作 题解: 如果x号节点本身就是一个叶节点,那么谁先走 ...
- AtCoder Beginner Contest 170 D - Not Divisible (数学)
题意:有一长度为\(n\)的数组,求该数组中有多少元素不能整除其它任一元素的个数. 题解:刚开始写了个分解质因数(我是傻逼),后来发现直接暴力枚举因子即可,注意某个元素出现多次时肯定不满足情况,再特判 ...
- Gym 2009-2010 ACM ICPC Southwestern European Regional Programming Contest (SWERC 2009) A. Trick or Treat (三分)
题意:在二维坐标轴上给你一堆点,在x轴上找一个点,使得该点到其他点的最大距离最小. 题解:随便找几个点画个图,不难发现,答案具有凹凸性,有极小值,所以我们直接三分来找即可. 代码: int n; lo ...