「仮想関数」の版間の差分

提供: C++入門
移動: 案内検索
(ページの作成:「<!-- vim: filetype=mediawiki --> 読み方 ;仮想関数: かそうかんすう __TOC__ == 概要 == 仮想関数 を用いない場合、ポインタの型...」)
(相違点なし)

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()

関連項目