今天写了一篇汉语的和 C++、C# 有点关系的文章。把正文之前的 opening 贴上来好了,有兴趣请看 原文。
我正在转战 C++ 写密码学相关的代码。透露一下,我用了很多不同 fashion 的写程序的方法,包括 CRTP (用来做一些静态多态辅助性工作)、常规的面向对象技巧(设置虚拟方法等)、使用 STL、不使用 STL 等等。
写代码休息间隙,突然想温习一下多重继承、虚拟继承。实际上,我最开始接触面向对象编程、了解多重继承和虚拟继承的时候,还没有太想我会怎么利用这种功能,而且你懂的,很多教学资料会强烈地 discourage 这些“妖魔鬼怪”。当时我也了解过“接口”的概念,不过也不深入。(插一句,我从未接受正统 / 科班的面向对象程序设计训练,这方面是完全自学,而且可能很民科。)后来我用上了 C♯,对面向对象的理解愈加深入,然后有一天我就突然自己发现了:C♯ 的接口就是 C++ 里面没有成员变量的全都是纯虚函数(除了析构函数)的类,在 C♯ 里面一个类或接口实现一个接口,就等同于在 C++ 里公有虚拟继承之前那个类。这理应是 C++ 里实现“接口”语义的成语( idiom,惯用法)啊!我觉得所有人都应该这样做,包括(断断续续了解的 Microsoft 的一个 ABI 兼容的接口规范) COM 的生产者,而
QueryInterface
其实就是dynamic_cast
。沉浸在思考(和对过去这些“聪明”的回忆)中无法自拔,思想慢慢游荡到了 C♯ 的世界,CLR 不支持多重继承,但特殊照顾了接口,C♯ 还有一个为人称道的显式接口实现(有一半私有虚拟继承的感觉)……之后我的思考继续游荡,最终 “每天学会一点新知识” 。
如果你看到这里觉得有兴趣,你不需要翻到上面,我在这里也放了一个 链接。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.