仮想基本クラス(通常は菱形継承問題を解決するために使用される)の使用法を説明する多くのチュートリアルでは、多くの場合、この構造の設計に類似したコードがあります。
class Animal
{
public:
Animal()
{
cout << "Creating Animal\n";
}
};
///////////////////////////
class FourLegs : virtual public Animal
{
public:
FourLegs()
{
cout << "Creating FourLegs\n";
}
};
///////////////////////////
class Mammal : virtual public Animal
{
public:
Mammal()
{
cout << "Creating Mammal\n";
}
};
///////////////////////////
class Fox : public FourLegs, public Mammal
{
public:
Fox()
{
cout << "Creating Fox\n";
}
};
Foxのインスタンスを作成すると、期待どおりの出力が得られます。作成された動物は1つだけです。
Creating Animal
Creating FourLegs
Creating Mammal
Creating Fox
ご覧のとおり、2つのTier2クラスが仮想的に継承しています。現在、1つのティア2クラスのみが仮想的に継承され、もう1つはパブリックにのみ継承される場合、興味深い出力が発生する可能性があります。たとえば、FourLegsがパブリックに継承され、Mammalが仮想パブリックに継承される場合、これは次の出力になります。
Creating Animal
Creating Animal
Creating FourLegs
Creating Mammal
Creating Fox
これは奇妙で、疑問を投げかけます。継承ツリーのどこかに仮想継承を含むクラスを作成する完全なプロセスは何ですか?
一方、I FourLegsが仮想パブリックを継承し、Mammalがパブリックを継承している場合、出力は通常どおりです(仮想パブリックを継承していないかのように)。
Creating Animal
Creating FourLegs
Creating Animal
Creating Mammal
Creating Fox