从 C++ 多重继承、虚拟继承、接口语义谈到 C# 接口的一个小“坑”

2017-08-05 09:58:51 +08:00
 geelaw

今天写了一篇汉语的和 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♯ 还有一个为人称道的显式接口实现(有一半私有虚拟继承的感觉)……之后我的思考继续游荡,最终 “每天学会一点新知识”

如果你看到这里觉得有兴趣,你不需要翻到上面,我在这里也放了一个 链接

1999 次点击
所在节点    分享发现
2 条回复
AngelCriss
2017-08-05 10:51:58 +08:00
话说,我重来没用过虚继承,知道的需继承也就标准库里那个菱形的变态。。。多重继承经常用在 make function,好用。
geelaw
2017-08-05 11:15:06 +08:00
@AngelCriss 你是把 CRTP 和 MI 放一起了嘛。我最近的一段代码里用 CRTP 的方式桥接真正的基类和派生类,是用来帮助做 RTTI 的(但我不想引入虚函数,为了保持类型是 trivially destructible 的)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/380581

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX