C++
 Computer >> コンピューター >  >> プログラミング >> C++

【初心者向け】C++の仮想関数(virtual)の仕組みと使い方を徹底解説

このチュートリアルでは、C++における仮想関数(virtual function)について、サンプルプログラムを通じてわかりやすく解説します。

仮想関数とは?

仮想関数とは、基底クラスで virtual キーワードを付けて宣言されるメンバ関数のことです。仮想関数は、派生クラス(子クラス)でも同じシグネチャで再定義(オーバーライド)することができます。

ポイントは、基底クラスのポインタや参照を通じて関数を呼び出した場合の挙動です。仮想関数として宣言されている場合は、実際に指しているオブジェクトのクラスに応じて、オーバーライドされた側の関数が実行されます。これにより、実行時ポリモーフィズム(動的多態性)が実現されます。

サンプルコード

#include <iostream>
using namespace std;

class base {
    public:
    virtual void print(){
        cout << "print base class" << endl;
    }
    void show(){
        cout << "show base class" << endl;
    }
};

class derived : public base {
    public:
    void print(){
        cout << "print derived class" << endl;
    }
    void show(){
        cout << "show derived class" << endl;
    }
};

int main(){
    base* bptr;
    derived d;
    bptr = &d;

    // 仮想関数の呼び出し
    bptr->print();

    // 非仮想関数の呼び出し
    bptr->show();
}

実行結果

print derived class
show base class

実行結果の解説

このプログラムでは、基底クラス base のポインタ bptr が、派生クラス derived のオブジェクトを指しています。ここで重要なのは、次の2つの呼び出し結果の違いです。

  • bptr->print()print()virtual が付いた仮想関数なので、呼び出しが実行時に解決され、実際のオブジェクトである derived クラスの print() が呼ばれます。そのため「print derived class」が出力されます。
  • bptr->show()show() は仮想関数ではないため、呼び出しはコンパイル時にポインタの型(base*)をもとに解決されます。そのため、オブジェクトが derived であっても、基底クラスの show() が呼ばれ、「show base class」が出力されます。

まとめ

仮想関数を使うことで、基底クラスのインターフェースを通じて、派生クラスごとに異なる処理を実行できるようになります。これはオブジェクト指向プログラミングにおける多態性の中核となる機能であり、柔軟で拡張性の高い設計には欠かせません。派生クラスで挙動を差し替えたいメンバ関数には、忘れずに virtual を付けましょう。

  1. C++のlog()関数とは?自然対数を求める方法をわかりやすく解説

    C++の標準ライブラリには、数学的な計算を行うための便利な関数が多数用意されています。その中でもlog()関数は、数値の自然対数(ネイピア数 e を底とする対数)を求めるために使用される重要な関数です。log()関数の基本情報C/C++のライブラリ関数 double log(double x) は、引数 x の自然対数(底が e の対数)を返します。この関数を使用するには、ヘッダーファイル <cmath> をインクルードする必要があります。関数の宣言double log(double x)パラメータと戻り値パラメータ: x は浮動小数点型(double)の値です。自然対数を求めたい

  2. C++のフレンド関数とフレンドクラスの基本を解説

    C++におけるフレンド関数(friend function)とは、クラスのスコープ外で定義される関数でありながら、そのクラスのすべてのprivateメンバーおよびprotectedメンバーにアクセスする権限を持つ特別な関数です。フレンド関数のプロトタイプ(宣言)はクラス定義の中に記述しますが、あくまで「友達」として扱われるだけであり、クラスのメンバー関数にはなりません。この点は重要なポイントです。フレンドとして指定できるものフレンドとして宣言できるのは、以下のようなものです。通常の関数関数テンプレート他のクラスのメンバー関数クラス全体(この場合、そのクラスのすべてのメンバーがフレンドになります