我遇到了钻石继承问题,并发现了使用单个钻石解决不同情况的不同方法。然而,我找不到解决“链式”钻石的方法。
根据结构:是的,我想每次都有多个基类,因此虚拟继承不是解决方法(那么它是否仍称为钻石问题?)。我也想避免为钻石的每个中间层编写get/set函数。
根据结构:是的,我想每次都有多个基类,因此虚拟继承不是解决方法(那么它是否仍称为钻石问题?)。我也想避免为钻石的每个中间层编写get/set函数。
p p
| |
k k
\ /
s
class parent { int val; };
class kid1 : public parent {};
class kid2 : public parent {};
class school : public kid1, public kid2 {};
现在访问父类中的val的方式如下:
school* s = new school;
s->kid1::val=1; // works
但接下来的“链接”钻石怎么处理呢:
p p p p
| | | |
k k k k
\ / \ /
s s
| |
c c
\ /
w
class country1 : public school {};
class country2 : public school {};
class world : public country1, public country2 {};
通过以下方式访问val:
world* w = new world;
w->country1::kid1::val=1; // error
结果为:
error: ‘kid1’ is an ambiguous base of ‘world’
为什么?路线到达这个值不是已经明确定义好了吗?
school : kid
的关系违反了LSP原则。至少我从来没有去过一个由两个孩子组成的学校 :) - fredoverflow