如果我不想用C++的多继承,如何实现类似java的实现接口语法来扩展类?
黄舟
黄舟 2017-04-17 11:51:15
0
5
546

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

那如何扩展类的功能呢?

谢谢!

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

membalas semua(5)
洪涛

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

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

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

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

洪涛

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

刘奇

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

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

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

Peter_Zhu

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

洪涛

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan