在某些OOPS语言中(例如curl),通过将重复继承的类设置为“共享”来处理钻石问题?我想知道这是如何工作的。另外,我想知道当使用共享策略时,主要和辅助构造函数在解决这些OOPS语言中的菱形问题时所扮演的角色。 假设有4个类,例如A,B,C和D。让继承结构为B,C继承A,D继承B和C。每个类都有一个变量,例如A具有a,B具有b,C具有c和D有d。每个类如何创建对象?
答案 0 :(得分:1)
在Curl上引用https://en.wikipedia.org/wiki/Multiple_inheritance的Wikipedia 项目符号:
Curl仅允许将明确标记为共享的类 反复继承。共享类必须定义一个辅助类 类中每个常规构造函数的构造函数。常规 首次调用共享类的状态的构造函数 通过子类构造函数初始化,然后通过辅助 所有其他子类都将调用构造函数。
从这里开始,不知道Curl,仅带有上面的引号和this,并指出
Curl的对象语义类似于Java和C ++。
给予
A
/ \
B(A) C(A)
\ /
D(B,C)
我想(不确定),当从D(B,C)子类调用父构造函数时,编码器负责通过指定要运行的构造函数的限定名称来消除此问题。 / p>
似乎必须声明A shared
,并且在创建D时,B运行一个调用A(主要)构造函数的构造函数,C运行一个调用A(第二)构造函数的构造函数。主/辅助构造函数调用之间的区别是自动的,并且对编码人员是透明的。
在调用两个A构造函数时,会在内存中创建两个A对象,即A类与两个不同的子类共享,但是没有一个“共享” A对象,而是两个独立的对象(另请参见{ {3}}在某种程度上是相关的(C ++)。
对于我用几种不同语言阅读的内容来说,几乎总是用编码器消除了钻石问题的资格。语言只是定义了不同的或相似的方案来给出错误,或具有选择多个歧义定义之一的条件,例如继承链中的特定搜索顺序。其他一些语言甚至不允许多重继承,但是在其中一些语言中,您可以通过其他方式(例如接口)来扩展功能。