11

我遇到了钻石问题,并为单个钻石的不同情况找到了不同的解决方案。但是我找不到“链式”钻石的解决方案。

根据结构:是的,我希望每次都有多个基类,所以虚拟继承不是一个解决方案(它甚至被称为钻石吗?)。我还想避免对钻石的每个中间层使用 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 {};

在父类中访问 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’

为什么?通向价值的途径不是很明确吗?

4

2 回答 2

3

s->kid1::val并不意味着“val来自kid1子对象”。它只是一个由包含它的类型(而不是子对象)限定的名称。

我不知道为什么country1::kid1甚至被接受,但显然它是::kid1. 两者中的两个数据成员world都有限定名::kid1::val

你想要的是:

world* w = new world;
country1* const c1 = world;
c1->kid1::val = 1;
于 2011-03-18T14:31:44.420 回答
1

这是。该错误是由于编译器中的错误引起的。

于 2011-03-18T17:43:48.247 回答