nem*_*nem 11 c++ inheritance diamond-problem
我遇到了钻石问题,并为一个钻石找到了不同案例的不同解决方案.但是,我无法找到"链式"钻石的解决方案.
根据结构:是的,我希望每次都有多个基类,因此虚拟继承不是解决方案(它甚至称为菱形?).我还想避免钻石每个中间层的get/set-functions.
p p
| |
k k
\ /
s
class parent { int val; };
class kid1 : public parent {};
class kid2 : public parent {};
class school : public kid1, public kid2 {};
Run Code Online (Sandbox Code Playgroud)
在父类中访问val现在可以如下工作:
school* s = new school;
s->kid1::val=1; // works
Run Code Online (Sandbox Code Playgroud)
但是下一个"链式"钻石呢:
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 {};
Run Code Online (Sandbox Code Playgroud)
访问val via:
world* w = new world;
w->country1::kid1::val=1; // error
Run Code Online (Sandbox Code Playgroud)
结果是:
error: ‘kid1’ is an ambiguous base of ‘world’
Run Code Online (Sandbox Code Playgroud)
为什么?是不是很好地定义了价值的路线?
s->kid1::val
并不意味着“val
来自kid1
子对象”。它只是一个由包含它的类型(而不是子对象)限定的名称。
我根本不知道为什么country1::kid1
会被接受,但显然它是::kid1
. 两个数据成员都有world
限定名称::kid1::val
。
你想要的是:
world* w = new world;
country1* const c1 = world;
c1->kid1::val = 1;
Run Code Online (Sandbox Code Playgroud)