virtualを付けた関数を”仮想関数”と呼ぶ。
仮想関数にすると、親クラス型の参照を使って子クラスのメソッドにアクセスした場合、子クラスで定義されたメソッドが実行される。
virtualを付けなかった場合は、親クラス型の参照からアクセスすると、親クラス側のメソッドが実行される。もちろんvirtualを付けなくてもメソッドのオーバーライド自体は出来て、子クラス型の参照からメソッドを呼び出せばオーバーライドしたメソッドが実行される。
以下の例を見た方が分かりやすい。
#include <iostream> using namespace std; struct animal { virtual void greet() { cout << "Hello, I'm an animal." << endl; } }; struct dog : animal { void greet() { cout << "Hello, I'm a dog." << endl; } }; struct cat : animal { void greet() { cout << "Hello, I'm a cat." << endl; } }; int main(int argc, char **argv) { animal *p = NULL; p = new dog; p->greet(); delete p; p = new cat; p->greet(); delete p; return 0; }上のコードを実行すると、
Hello, I'm a dog. Hello, I'm a cat.のようになる。
greetメソッドにvirtualを付けない場合は、
Hello, I'm an animal. Hello, I'm an animal.となってしまう。
0 件のコメント:
コメントを投稿