C++ で仮想継承 ― 2021年02月22日 12時13分27秒
継承のクラスを書くときに virtual キーワードを使う。
これは、いわゆるダイヤモンド型の継承を行うときに必要になる形。二つのクラスを継承するが、その二つのクラスも他の同一クラスを継承している場合。
class A: virtual public B
{
};
上のクラス B と C はクラス A を基底としている。これの B と C をそのまま継承するとコンパイルエラーになる。
class B: public A
{
};
class C: public A
{
};
実際のコードを使っての実験。追加の継承を組んだが、clang は問題を見つけてくれる。
X、Y、Z のクラスは仮想継承を使っているのでエラーにならない。
% cat virtual_inheritance.cpp
struct A { ~A(){} };
struct B : public A { };
struct C : public A { };
struct D : public B { };
struct E : public B, public C { };
struct Z : virtual public A { };
struct Y : virtual public A { };
struct X : public Z, public Y { };
A* a() { return new A; }
A* b() { return new B; }
A* d() { return new D; }
A* e() { return new E; }
A* x() { return new X; }
% clang++ virtual_inheritance.cpp
virtual_inheritance.cpp:14:17: error: ambiguous conversion from derived class
'E' to base class 'A':
struct E -> struct B -> struct A
struct E -> struct C -> struct A
A* e() { return new E; }
^~~~~
1 error generated.
コメント
トラックバック
このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2021/02/22/9349659/tb
※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※なお、送られたコメントはブログの管理者が確認するまで公開されません。