2012-11-12

吐槽面向对象的C++编程语言

Views: 7885 | Add Comments

最近不得不又重新拿起"面向对象的C++编程语言", 又禁不住要发感慨. 虽然之前已经对C++中指向类函数的指针发过感慨了, 还听过Linus对C++的各种不屑. C++, 真是解决一千个问题的同时又恶心一千个程序员.

多重继承(Multiple Inheritance)

在我看来, C++之恶很大一部分来源于违反自然伦理的"多重继承(Multiple Inheritance)", 也就是一个子类可以同时拥有多个直接的父类, 这就相当于一个怪胎是由两个以上的精子发育而成的! 所有支持多重继承的编程语言(包括C++和Python), 调用父类方法的语法都非常的繁琐和恶心.

C++的多重继承导致了什么问题? 它导致了这些问题:

1. 构造函数不能继承 -- 子类如果想拥有父类的所有构造函数, 必须重新再定义一遍!

2. 指向类的函数的指针变得毫无意义.

3. 各种各样为了解决多重继承而"发明"的语法糖...

虚函数(virtual method)

有C++程序去学习Java时, 总结出"Java的所有成员函数都是虚函数". 为什么要这么总结? 原来, C++的子类函数不能自动覆盖父类函数, 所以才又"发明了"虚函数的概念...

这又是C++违反自然规律的地方, 覆盖当然是应该的. 而C++竟然因为观察解角度的不同(指向对象的不同指针类型), 而看到不同的方法...

再吐槽面向对象编程

面向对象的思想的确是分析业务对象的绝妙方法, 但面向对象的编程语言的表达能力就让人实在不敢恭维. 目前为止, 所有的面向对象编程语言的三个特性: 封装, 继承, 多态, 除了"封装"是一种思想, 继承和多态都无法表达业务模型, 只能用来做代码封装. 如果一个人发现了业务对象的继承关系, 便立即写两个类来继承的话, 那么他肯定是走火入魔了. 类(代码)是否应该继承, 取决于代码本身, 与业务无关.

C和C++

目前, 一个系统如果要作为基础服务的话, 一般要用C或者C++来编写才能让人信服. Java能替代一些, 但还远远不够, 自然选择的结果也是这样的. C语言的一主要问题有这几个: 没有命名空间和类, 缺少一些广泛使用的通用库. 但C++的各种模型和规则等等, 又非必要. 所以, 只要C语言增加Java的对象模型, 再允许函数直接处于包之中, 就足够了, 有没有智能GC并不重要.

虽然已经多年不写Java了, 同时也对Java静态类型以及某些繁琐语法不爽, 但还是偶尔会怀念Java. 据说, Java发明过程, 很大一部分就是参照C++做加法和减法.

Related posts:

  1. SSDB与Redis命令对比
  2. 构建C1000K的服务器(2) – 实现百万连接的comet服务器
  3. 要记得清除 sockaddr_in
  4. LevelDB 会丢数据吗?
  5. C++成员函数作为pthread_create参数
Posted by ideawu at 2012-11-12 00:08:24

Leave a Comment