仮想継承

From Wikipedia, the free encyclopedia

仮想継承(かそうけいしょう、: Virtual inheritance)とは、C++プログラミング言語における継承の一種で、多重継承によって生じる問題(菱形継承問題)を解決するもの。どの上位クラスのメンバーを使うか曖昧さが生じる部分で、明確化する。仮想継承は、部分の合成という意味での継承よりも、継承が上位クラスへの制限を表している場合に使われる。多重継承の基底クラスは、virtual というキーワードで仮想継承であることを指定される。

次のようなクラス階層を考える。

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;

bateat() メソッドを呼び出した場合、どうなるだろうか? 上の宣言では bat.eat() の呼び出しは曖昧である。bat.WingedAnimal.Animal::eat() なのか bat.Mammal.Animal::eat() なのか判らない。問題は、いわゆる多重継承の意味論が現実をモデル化したものではない点にある。感覚的に言えば、AnimalAnimal でしかないように、BatMammal であると同時に WingedAnimal である。しかしBat(こうもり)のMammal(哺乳類)性におけるAnimal(動物)性は、WingedAnimal(翼のある動物)性におけるAnimal(動物)性と同じである。

このような状況を菱形継承と呼び、これを解決するのが仮想継承である。

クラス表現

解決策

外部リンク

Related Articles

Wikiwand AI