V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
geelaw
V2EX  ›  分享发现

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

  •  
  •   geelaw · 2017-08-05 09:58:51 +08:00 · 1992 次点击
    这是一个创建于 2449 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    2 条回复    2017-08-05 11:15:06 +08:00
    AngelCriss
        1
    AngelCriss  
       2017-08-05 10:51:58 +08:00 via Android
    话说,我重来没用过虚继承,知道的需继承也就标准库里那个菱形的变态。。。多重继承经常用在 make function,好用。
    geelaw
        2
    geelaw  
    OP
       2017-08-05 11:15:06 +08:00 via iPhone
    @AngelCriss 你是把 CRTP 和 MI 放一起了嘛。我最近的一段代码里用 CRTP 的方式桥接真正的基类和派生类,是用来帮助做 RTTI 的(但我不想引入虚函数,为了保持类型是 trivially destructible 的)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3750 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 10:21 · PVG 18:21 · LAX 03:21 · JFK 06:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.