仮想関数その1

継承の関係

以下の説明において、Baseを基底クラス、Derivedをその派生クラスとする。

ポインタ変数の明示的キャスト

	Base*		pb;
	Derived*	pd;
	pb = pd;
	pd = pb;	// 不可
Derivedの中にはBaseが含まれているので、Derived*からBase*には変換できる。

仮想関数とは

クラスのメンバ関数でvirtualとついたものが仮想関数になる。 一度、仮想関数になったら、継承関係の下では常に仮想関数になる。
	Derived	d;
	Base*	p = &d;
としたとき、p->func() は、
  • 仮想関数のとき、Derived::func()が呼ばれる。
  • そうでないとき、Base::func()が呼ばれる。

    class Animal {
    public:
    virtual void v_naku(){cout << "WOO...\n";}
    	void   naku(){cout << "WOO...\n";}
    };
    class Dog : public Animal {
    public:
    	void v_naku(){cout << "Wan Wan\n";}
    	void   naku(){cout << "Wan Wan\n";}
    };
    
    	Dog	d;
    	Dog*	pd = &d;
    	Animal*	pa = pd;
    	pd->v_naku();	// Which Woo... or WanWan ?
    	pd->  naku();	// Which Woo... or WanWan ?
    	pa->v_naku();	// Which Woo... or WanWan ?
    	pa->  naku();	// Which Woo... or WanWan ?
    

    派生クラスのオブジェクトでの呼ばれる順番

    コンストラクタ
    1. 基底クラスのコンストラクタ
    2. 派生クラスのコンストラクタ
    デストラクタ
    1. 派生クラスのデストラクタ
    2. 基底クラスのデストラクタ

    戻る