「仮想関数」の版間の差分
提供: C++入門
(相違点なし)
|
2013年3月24日 (日) 00:39時点における版
読み方
- 仮想関数
- かそうかんすう
目次
概要
仮想関数 を用いない場合、ポインタの型のメンバが呼び出されます。 仮想関数 を使用したときは、派生クラスのポインタを基底クラスのポインタで受け取っても、派生クラスのメンバ関数を呼び出します。
通常の継承の例
この例では、仮想関数を使用していません。
ソースコード extends_1.cpp
#include <iostream> using namespace std; class B { public: void f() { cout << __PRETTY_FUNCTION__ << endl; } }; class C1 : public B { public: void f() { cout << __PRETTY_FUNCTION__ << endl; } }; int main(int argc, char const* argv[]) { B b; C1 c1; B *p; p = &b; p->f(); p = &c1; p->f(); return 0; }
コンパイル
g++ extends_1.cpp -o extends_1
実行例
クラス B と C1 は、両方とも基底クラスのf()を呼び出しています。
% ./extends_1 void B::f() void B::f()
仮想関数の例
ソースコード virtual_1.cpp
#include <iostream> using namespace std; class B { public: virtual void f() { cout << __PRETTY_FUNCTION__ << endl; } }; class C1 : public B { public: void f() { cout << __PRETTY_FUNCTION__ << endl; } }; int main(int argc, char const* argv[]) { B b; C1 c1; B *p; p = &b; p->f(); p = &c1; p->f(); return 0; }
コンパイル
g++ virtual_1.cpp -o virtual_1
実行例
クラス B のポインタにC1のアドレスを渡して、f() を呼び出すと、C1のメンバ関数が呼び出されています。
% ./virtual_1 virtual void B::f() virtual void C1::f()