【问题标题】:C++/CLI: inherit from one CLR class, multiple C++ classesC++/CLI:从一个CLR类、多个C++类继承
【发布时间】:2011-09-09 15:10:14
【问题描述】:

在 C++/CLI 中,我想要一个类似于以下的类层次结构:

Foo
  FooA : Foo, ClrClassA
  FooB : Foo, ClrClassB

FooA 是否可以共享一个(非 CLR)基类,同时也从单独的 CLR 类继承?如果没有,FooA 和 FooB 共享公共代码的最佳方式是什么?

【问题讨论】:

    标签: .net visual-c++ c++-cli multiple-inheritance mixed-mode


    【解决方案1】:

    一般来说,composition is often better than inheritance 因为它往往会导致设计不那么紧密。

    如果您混合使用托管代码和非托管代码,根据我的经验,将非托管代码包装在托管代码中通常更容易,反之亦然。

    托管代码不支持多重继承,an article on Wikipedia 解释了原因:

    托管 C++ 以及类和基于类的对象的使用仍然很普遍,就像在 Visual C++ 中一样。在托管 C++ 中对此的唯一主要更改是不支持多重继承的功能。这是因为 CLR 的限制。在 CLR 的垃圾收集器下管理的类不能继承多个类

    在不知道为什么您想要组合这些类的情况下,很难就如何最好组合您的类/功能给出一个好的答案...

    【讨论】:

    • 需要明确的是,托管类型不支持多重继承,也不支持从本机类型派生。
    • FooA 将是 WinForms 控件并继承自 Control,FooB 将是 WPF 控件并将继承自 FrameworkElement。这个想法是为 WinForms 和 WPF 创建一个共享大量代码的控件。
    • @antony - 组合肯定会为此工作,如果您有需要在公共代码中的两种类型的控件中触发的东西,您可以使用委托函数:functionx.com/cppcli/classes/Lesson15c.htm
    【解决方案2】:

    您不能让一个类同时继承自引用类型和本机类型。

    【讨论】:

    • 更严格:class 不能继承一个ref class。一个ref class 甚至不能继承一个class。后者是每个ref class (可能间接)从System.Object 继承的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 2013-07-27
    • 2016-09-20
    • 2013-09-03
    相关资源
    最近更新 更多