钻石问题是在一些面向对象的语言中处理的(例如,curl)通过将重复继承的类设置为“共享”?我想知道这是怎么回事。此外,我想知道当使用共享策略时,主构造函数和辅助构造函数在解决这些OOPS语言中的菱形问题中所扮演的角色。假设有4个类,A,B,C和D。假设继承结构是b,C继承a,d继承B和C。每个类都有一个变量,比如A有a,B有b,C有c,D有d。每个类的对象创建是如何发生的?
发布于 2018-11-19 07:49:39
引用维基百科https://en.wikipedia.org/wiki/Multiple_inheritance at the Curl bullet:
Curl只允许重复继承显式标记为共享的类。共享类必须为类中的每个常规构造函数定义一个辅助构造函数。第一次通过子类构造函数初始化共享类的状态时,将调用常规构造函数,并且将为所有其他子类调用辅助构造函数。
从这里开始,不知道Curl,只使用上面的引号和this,其中声明
Curl的对象语义与
和C++的对象语义相似。
给定的
A
/ \
B(A) C(A)
\ /
D(B,C)我想象(我不确定),当从D(B,C)子类调用父构造函数时,编码器负责通过指定要运行的构造函数的限定名来消除问题的歧义。
看起来A必须声明为shared,当创建D时,B运行调用A(主)构造函数的构造函数,C运行调用A(辅助)构造函数的构造函数。主/次构造函数调用之间的区别是自动的,并且对程序员来说是透明的。
当调用两个A构造函数时,将在内存中创建两个A对象,即A类与两个不同的子类共享,但不是一个“共享”的A对象,而是两个独立的A对象(另请参阅某种程度相关的virtual/nonvirtual inheritance (C++))。
对于我所读到的几种不同的语言,几乎总是程序员用限定来消除菱形问题的歧义。语言只是定义了不同或相似的给出错误的方案,或者有一个标准来选择多个模糊定义中的一个,比如继承链中的特定搜索顺序。其他一些语言甚至不允许多重继承,但在其中一些语言中,您可以通过其他方式(如接口)来扩展功能。
https://stackoverflow.com/questions/53288888
复制相似问题