cari

Rumah  >  Soal Jawab  >  teks badan

如果我不想用C++的多继承,如何实现类似java的实现接口语法来扩展类?

C++的多继承很难理解,可是如果单继承又觉得以后无法扩展功能,object-c有protocol,C++没有。

那如何扩展类的功能呢?

谢谢!

黄舟黄舟2807 hari yang lalu550

membalas semua(5)saya akan balas

  • PHP中文网

    PHP中文网2017-04-17 11:53:15

    C++要想实现protocol或者java的interface,除了多继承没有它路了……怕冲突可以使用虚继承。
    列出两种不怎么可行的做法:

    一种是使用组合而非继承。
    把想实现的一组功能定义为一个类A,然后把这个类A作为一个目标类B的一个成员。再给类B写出一组public方法,这些方法将通过转调类A的方法来实现功能。
    但是这样做实现不了interface那样的功能。原因很明显,类A和类B不位于同一个类体系中。

    第二种是使用模板。
    假如某个类实现了一组想要的功能,我们就可以给这个类提供一个tag。如果有一个函数需要使用这一组功能,那么我们可以检查给的模板参数中是否有这么一个tag,如果没有这么一个tag,程序将不能通过编译。
    但是这样比较复杂,真的决定要这么做么?

    其实,如果不要求实现得像protocol,可以考虑使用工厂函数/对象。即提供一组参数作为函数/方法的参数,生成基类相同,但是对基类方法的实现有差别的一组子类。这样就能使用基类指针调用它们的方法。

    balas
    0
  • PHP中文网

    PHP中文网2017-04-17 11:53:15

    java类实现接口的语义,就是c++里的虚继承,目的就是为了避免菱形继承的二义性问题。

    balas
    0
  • 怪我咯

    怪我咯2017-04-17 11:53:15

    C++中的设计模式对于你的这种扩展一般使用继承+组合来实现;
    你可以考虑先使用一个抽象类Abstraction,用业务类RefinedAbstraction继承它;
    然后,根据你的需要,将你需要进行功能扩展的接口以组合的形式(一般定义为指针)放到你的抽象类或者业务类中:
    Implementor:实现类接口
    ConcreteImplementor:具体实现类

    参考《图说设计模式》中桥接模式的这个图你就明白了:

    详情请见:
    http://design-patterns.readthedocs.org/zh_CN/latest/structural_patterns/bridge.html

    balas
    0
  • 天蓬老师

    天蓬老师2017-04-17 11:53:15

    尽可能多用组合,少用继承,java,objC和C++都是

    balas
    0
  • PHP中文网

    PHP中文网2017-04-17 11:53:15

    少用继承,多用 std::function / std::bing / lambda

    balas
    0
  • Batalbalas