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

【C++入門】派生クラスにおける仮想関数の仕組みと使い方

C++の派生クラスにおける仮想関数とは

C++における仮想関数(virtual function)は、基底クラスへのポインタのリストを作成し、派生クラスオブジェクトの実際の型を知らなくても、任意の派生クラスのメソッドを呼び出すために使用されます。仮想関数の呼び出しはコンパイル時ではなく、実行時に解決される「遅延バインディング(レイトバインディング)」という仕組みで処理されます。

派生クラスではvirtualキーワードが不要

基底クラスのメンバ関数を一度virtualキーワード付きで宣言すると、その基底クラスから派生したすべてのクラスにおいて、その関数は自動的に仮想関数となります。そのため、派生クラスで基底クラスの仮想関数を再定義(オーバーライド)する際には、virtualキーワードを明示的に付ける必要はありません。

なお、コードの可読性を高めるために、派生クラスでもあえてvirtualキーワードを記述するスタイルもあります。また、C++11以降では、オーバーライドの意図を明確にするためのoverrideキーワードを併用することが推奨されています。

サンプルコード

#include<iostream>
using namespace std;
class B {
    public:
        virtual void s() {
            cout<<" In Base \n";
        }
};
class D: public B {
    public:
        void s() {
            cout<<"In Derived \n";
        }
};
int main(void) {
    D d; // クラスDのオブジェクト
    B *b = &d; // dを指すB*型のポインタ
    b->s(); // "In Derived"と出力される
    return 0;
}

コードの解説

この例では、基底クラスBに仮想関数s()を定義し、派生クラスDがBを継承してs()を再定義しています。main関数では、クラスDのオブジェクトdを生成し、そのアドレスを基底クラス型のポインタbに代入しています。

ここでb->s()を呼び出すと、ポインタの型がB*であっても、実際に指しているオブジェクトがD型であるため、派生クラスD側のs()が実行されます。これが仮想関数による動的バインディングの動作です。

出力結果

In Derived

まとめ

仮想関数は、C++でポリモーフィズム(多態性)を実現するための重要な機能です。基底クラスのポインタや参照を通じて、実際のオブジェクトの型に応じた関数が実行時に自動的に選択されるため、柔軟で拡張性の高いオブジェクト指向設計が可能になります。

  1. C++のクラスとオブジェクトとは?基本概念と定義方法を初心者向けに解説

    クラスは、C++における最も重要な機能の一つです。オブジェクト指向プログラミング(OOP)の中核となる概念を実現するためのユーザー定義型であり、データ変数と、そのデータを操作するための関数を1つのパッケージにまとめることができます。クラスは、オブジェクトの設計図(仕様)を提供する役割を担います。クラスの定義方法クラスの定義は「class」キーワードから始まり、その後にクラス名を記述します。続いて、波括弧({})で囲まれたクラス本体を定義し、末尾に必ずセミコロン(;)を付けます。C++におけるクラス定義の基本的な例は以下の通りです。class Student {   &nbs

  2. C++の記憶クラス(ストレージクラス)とは?auto・static・externなどの5種類を解説

    C++プログラミングにおいて、記憶クラス(ストレージクラス)とは、変数や関数のスコープ(可視性)と寿命(ライフタイム)を定義するための指定子です。記憶クラス指定子は、修飾対象となる型の前に記述します。C++プログラムで使用できる記憶クラスには、以下の5種類があります。 auto register static extern mutable auto:自動記憶域期間 auto記憶クラス指定子は、自動記憶域を持つ変数を明示的に宣言するためのものです。ブロック内で宣言された変数のデフォルトはautoであり、自動記憶域を持つ変数xは、xが宣言されたブロックを抜けると破棄されます。 auto指定子は