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

C++の純粋仮想関数が「= 0」で宣言される理由を徹底解説

C++において、純粋仮想関数(Pure Virtual Function)が = 0 で初期化されるのは、特別な技術的な意味があるわけではなく、単に「この関数は純粋仮想である」ということをコンパイラに伝えるための構文にすぎません。

純粋仮想関数とは?

純粋仮想関数とは、C++における仮想関数の一種で、基底クラス側では関数の定義(実装)を書かず、宣言だけを行う関数のことです。宣言時に = 0 を代入することで、純粋仮想関数として宣言されます。

純粋仮想関数を1つ以上持つクラスは「抽象クラス」と呼ばれ、直接インスタンス化することはできません。派生クラスは、この純粋仮想関数を必ずオーバーライドして実装する必要があります。

サンプルコード

以下は、C++プログラムにおける純粋仮想関数の使用例です。

#include<iostream>
using namespace std;

class B {
public:
    virtual void s() = 0; // 純粋仮想関数
};

class D : public B {
public:
    void s() {
        cout << " Virtual Function in Derived class\n";
    }
};

int main() {
    B *b;
    D dobj;
    b = &dobj;
    b->s();
}

実行結果

Virtual Function in Derived class

コードのポイント

virtual void s() = 0; のように、関数本体を持たずに = 0 を付けることで、この関数が純粋仮想関数であることを示しています。クラス B は抽象クラスとなるため、B b; のようなオブジェクト生成はできませんが、ポインタや参照として利用することは可能です。

上記の例では、基底クラスのポインタ b を通じて、派生クラス D のオーバーライドされた関数が呼び出されており、多態性(ポリモーフィズム)が正しく機能していることがわかります。

  1. C++のswap()関数とは?2つの変数の値を入れ替える方法をサンプルコード付きで解説

    swap()関数とは C++のswap()関数は、2つの値を入れ替える(交換する)ための関数です。この関数を利用すれば、一時的な第三の変数を自分で用意することなく、2つの変数の値を簡単に入れ替えることができます。 swap()関数の構文 void swap(int variable_name1, int variable_name2); 変数に値を代入してswap()関数に渡した場合、関数内では値の入れ替えが行われますが、呼び出し元の実際の変数の値は変わりません。これは、引数が「値渡し」で渡されるためです。実際の変数の値を入れ替えたい場合は、後述する「参照渡し」を使用します。 例1:s

  2. C++のコンストラクタ内で仮想関数を呼び出すとどうなる?仕組みと注意点を解説

    コンストラクタやデストラクタの中から仮想関数を呼び出すのは危険な操作であり、可能な限り避けるべきです。その理由は、呼び出された仮想関数が派生クラスのものではなく、基底クラス(Base)のものとして実行されてしまうためです。 なぜ基底クラスの仮想関数が呼ばれるのか C++では、各クラスは自分自身の構築処理に入る前に、そのクラス専用の仮想メソッドテーブル(vtable)を先に構築します。この仕組みにより、コンストラクタ内で仮想メソッドを呼び出すと、現時点で有効になっているテーブル、つまり基底クラスの仮想メソッドが呼び出されることになります。 また、その階層に実装がまったく存在しない場合(純粋仮想関