今天写了一篇汉语的和 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♯ 还有一个为人称道的显式接口实现(有一半私有虚拟继承的感觉)……之后我的思考继续游荡,最终 “每天学会一点新知识” 。
如果你看到这里觉得有兴趣,你不需要翻到上面,我在这里也放了一个 链接。
1
AngelCriss 2017-08-05 10:51:58 +08:00 via Android
话说,我重来没用过虚继承,知道的需继承也就标准库里那个菱形的变态。。。多重继承经常用在 make function,好用。
|
2
geelaw OP @AngelCriss 你是把 CRTP 和 MI 放一起了嘛。我最近的一段代码里用 CRTP 的方式桥接真正的基类和派生类,是用来帮助做 RTTI 的(但我不想引入虚函数,为了保持类型是 trivially destructible 的)
|