同じスーパークラスを持つクラスを多重継承
http://www.geocities.jp/ky_webid/cpp/language/033.html
同じスーパークラスを持っているクラスを多重継承してしまうと問題が起こります。
#include <iostream> using namespace std; class CBase { public: void Foo () { cout << "CBase::Foo" << endl; } }; class CMiddle1 : public CBase { }; class CMiddle2 : public CBase { }; class CSub : public CMiddle1, public CMiddle2 { }; int main () { CSub obj; // CMiddle1のスーパークラスCBaseのFoo関数? // それともCMiddle2のスーパークラスCBaseのFoo関数? obj.Foo(); return 0; }
$ cl /W4 /EHsc main.cpp Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. main.cpp main.cpp(20) : error C2385: 'Foo' へのアクセスがあいまいです。 'Foo' (ベース 'CBase' 内) である可能性があります または、'Foo' (ベース 'CBase' 内) である可能性があります main.cpp(20) : error C3861: 'Foo': 識別子が見つかりませんでした
同じCBaseから派生しているCMiddle1とCMiddle2なんですが、どうもそれらを多重継承したCSubからはFoo関数が別々の物として見えているようです。
同じCBaseなんだから同一のものとして見なしてくれて良いような気がするんですがそうなってないみたいです。
で、それらを同じものと見なすための構文があります。
CBaseを継承するときに予めvirtualとつけるだけです。
class CMiddle1 : virtual public CBase { }; class CMiddle2 : virtual public CBase { };
$ main CBase::Foo
この継承の仕方を仮想継承というらしいです。
しかしこれ、CBaseを別々の物として見なしたいことなんでまずないんだし、デフォルトでvirtual付でも良いと思うんだけどどうなんでしょうか。クラスのサイズがでかくなるとか?んん。