第7回はオーバーライド(仮想関数)という機能です
オーバライドというのは
継承クラスで親クラスと同名でかつ戻り値引数が全く同じの関数を定義でき、
継承クラスで関数の仕様を再定義する方法です
(オーバロードと混同しないよう注意、オーバライドとは関係ない)
オーバライドの説明に入る前に
継承クラスのコンストラクタ、デストラクタがどのように
呼ばれるのか見てみましょう
#include <iostream> using namespace std; class Parent { public: // コンストラクタ Parent() { cout << "親クラスコンストラクタが呼ばれました" << endl; } // デストラクタ ~Parent() { cout << "親クラスデストラクタが呼ばれました" << endl; } }; class Child: public Parent { public: // コンストラクタ Child() { cout << "子クラスコンストラクタが呼ばれました" << endl; } // デストラクタ ~Child() { cout << "子クラスデストラクタが呼ばれました" << endl; } }; // main関数(クラスの外部) int main() { Child ch; cout << endl; cout << "なんか処理する" << endl; cout << endl; return 0; }
親クラスと子クラスのコンストラクタと
親クラスと子クラスのデストラクタが
両方呼ばれることに気づくはずです
(さらにいうとデストラクタはコンストラクタの逆順(子→親)に呼ばれています)
Java,C#などをやっている人は
派生クラスだけ呼ばれなくて気持ち悪いと思うかもしれませんが
C++は両方よばれます
さて、本題に入りたいと思います
オーバライド(継承クラスで仕様を変えたい)を実践するには次のように書きます
// オーバーライド #include <iostream> using namespace std; class Parent { public: void Show() { cout << "親クラスShow" << endl; } }; class Child: public Parent { public: // オーバーライド void Show() { cout << "子クラスShow、オーバーライド" << endl; } }; // main関数(クラスの外部) int main() { Parent pt; Child ch; pt.Show(); ch.Show(); return 0; }
Parent型の変数ptのほうのShow関数の呼び出しは親クラスのほう
一方、Child型の変数chのほうのShow関数の呼び出しは子クラスのほう
がよばれていることがわかります。
このように、継承クラスで基本クラスと全く同じ関数を定義すると
継承時にはオーバライドされた関数が呼ばれます。
次回は仮想関数によるポリモーフィズムです。
次回でC++基礎講座は一旦終わりになります。