Effective C++ Item 402009年08月25日 06時28分42秒

  • 多重継承は不明確な名前や仮想継承などが必要になるなど、複雑になる要素が多い。
  • 仮想継承は大きさ、実行速度、初期化と代入が複雑になるなど、影響が大きい。基底クラスがメンバ変数を持たないときぐらいにしか使えない。
  • 多重継承にも有用な使い方がある。例えば、パブリック継承としてインターフェースを引き継ぎ、プライベート継承を通して実装を流用する時などがある。

C++ での関数の名前解決は、まず関数名のよって型の適合などを含めて一番適した関数が検索される。その後に、パブリック、プライベートなどのアクセス権限が調べられる。

多重継承では、同一名の関数が存在する為に、どの関数を呼ぶのかが不明瞭になる時がある。これはスコープを指定して関数を呼ぶことで回避できる。


class BorrowableItem{
    public:
        void checkOut(); // 図書館で借りられる。
};

class ElectronicGadget{
    public:
        bool checkOut(); // 自己検診。

};

class MP3Player: public BorrowableItem, public ElectronicGadget
{...};

MP3Player mp;
mp.checkOut(); // 不明瞭。
mp.BorrowableItem::checkOut(); // BorrowableItem の checkOut;

また、多重継承時に基底クラスが同じだと、同じ基底クラスを複数持つ事になる。 そのような場合は、仮想継承を用いることで、動的に基底クラスにアクセス出来るようになる。


class File{...};
class InputFile: virtual public File{...};
class OutputFile: virtual public File{...};
class IOFile: public InputFile, public OutputFile{...};

前回次回