仮想継承仮想継承(かそうけいしょう、英: Virtual inheritance)とは、C++プログラミング言語における継承の一種で、多重継承によって生じる問題(菱形継承問題)を解決するもの。どの上位クラスのメンバーを使うか曖昧さが生じる部分で、明確化する。仮想継承は、部分の合成という意味での継承よりも、継承が上位クラスへの制限を表している場合に使われる。多重継承の基底クラスは、 問題次のようなクラス階層を考える。 class Animal
{
public:
virtual void eat();
};
class Mammal : public Animal
{
public:
virtual Color getHairColor();
};
class WingedAnimal : public Animal
{
public:
virtual void flap();
};
// Bat(こうもり)は翼のある哺乳類(winged mammal)である
class Bat : public Mammal, public WingedAnimal {};
Bat bat;
このような状況を菱形継承と呼び、これを解決するのが仮想継承である。 クラス表現仮想継承を解説する前に、C++での継承におけるクラス表現を簡単に説明しておく。継承は、メモリ上では親クラスの後に子クラスを置いたリストで表される。上記の Bat の場合、(Animal, Mammal, Animal, WingedAnimal, Bat) となり、Animal が二度出現しているため、曖昧さが生じる。 解決策クラス宣言を次のように修正する。 // 2つのクラスは Animal を仮想継承する
class Mammal : public virtual Animal
{
public:
virtual Color getHairColor();
};
class WingedAnimal : public virtual Animal
{
public:
virtual void flap();
};
// こうもりは依然として翼のある哺乳類である
class Bat : public Mammal, public WingedAnimal {};
これで、 これは、 外部リンク
|