仮想関数その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 ?
コンストラクタ
- 基底クラスのコンストラクタ
- 派生クラスのコンストラクタ
デストラクタ
- 派生クラスのデストラクタ
- 基底クラスのデストラクタ
戻る