私はダイヤモンドの問題に遭遇し、単一のダイヤモンドを使用したさまざまなケースでさまざまな解決策を見つけました。しかし、私は「連鎖」ダイヤモンドの解決策を見つけることができませんでした。
構造によると:はい、私は毎回複数のベースクラスを持ちたいので、仮想継承は解決策ではありません(それはダイヤモンドと呼ばれることさえありますか?)。また、ダイヤモンドのすべての中間層の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’
なんで?値へのルートが明確に定義されていませんか?