logo

C++ 仮想関数

  • C++ 仮想関数は、派生クラスで再定義する基本クラスのメンバー関数です。これは、virtual キーワードを使用して宣言されます。
  • これは、関数に対して動的リンケージまたは遅延バインディングを実行するようにコンパイラーに指示するために使用されます。
  • 異なるクラスのすべてのオブジェクトを参照するには、単一のポインターを使用する必要があります。そこで、すべての派生オブジェクトを参照する基本クラスへのポインターを作成します。ただし、基底クラスのポインターに派生クラス オブジェクトのアドレスが含まれている場合は、常に基底クラスの関数が実行されます。この問題は、「仮想」機能を使用することによってのみ解決できます。
  • 「virtual」は、関数の通常の宣言に先行するキーワードです。
  • 関数が仮想化されると、C++ は、基本クラス ポインターが指すオブジェクトの型に基づいて、実行時にどの関数を呼び出すかを決定します。

遅延バインディングまたは動的リンケージ

遅延バインディングでは、関数呼び出しは実行時に解決されます。したがって、コンパイラは実行時にオブジェクトのタイプを決定し、関数呼び出しをバインドします。


仮想関数のルール

java ハズネクスト
  • 仮想関数は、何らかのクラスのメンバーである必要があります。
  • 仮想関数を静的メンバーにすることはできません。
  • これらには、オブジェクト ポインターを介してアクセスされます。
  • 彼らは別のクラスの友達になることができます。
  • 仮想関数は、使用されない場合でも、基本クラスで定義する必要があります。
  • 基本クラスとすべての派生クラスの仮想関数のプロトタイプは同一である必要があります。 2 つの関数の名前は同じですが、プロトタイプが異なる場合、C++ はそれらをオーバーロードされた関数とみなします。
  • 仮想コンストラクターは使用できませんが、仮想デストラクターは使用できます。
  • virtual キーワードを使用しない場合の状況を考えてみましょう。
 #include using namespace std; class A { int x=5; public: void display() { std::cout &lt;&lt; &apos;Value of x is : &apos; &lt;&lt; x&lt;<std::endl; } }; class b: public a { int y="10;" public: void display() std::cout << 'value of is : ' <<y<<std::endl; main() *a; b b; a->display(); return 0; } </std::endl;>

出力:

 Value of x is : 5 

上の例では、 * a は基本クラス ポインターです。ポインタは基本クラスのメンバーにのみアクセスできますが、派生クラスのメンバーにはアクセスできません。 C++ では、基本ポインターが基本クラスから派生した任意のオブジェクトを指すことを許可しますが、派生クラスのメンバーに直接アクセスすることはできません。したがって、ベース ポインターが派生クラスのメンバーにアクセスできるようにする仮想関数が必要になります。

C++ 仮想関数の例

プログラム内で派生クラスを呼び出すために使用される C++ 仮想関数の簡単な例を見てみましょう。

 #include { public: virtual void display() { cout &lt;&lt; &apos;Base class is invoked&apos;&lt;<endl; } }; class b:public a { public: void display() cout << 'derived is invoked'<<endl; int main() a* a; pointer of base b b; object derived a->display(); //Late Binding occurs } </endl;>

出力:

 Derived Class is invoked 

純粋な仮想機能

  • 仮想関数はタスクの実行には使用されません。これはプレースホルダーとしてのみ機能します。
  • 関数に定義がない場合、そのような関数は ' として知られています。 何もしない ' 関数。
  • ' 何もしない ' 関数はとして知られています 純粋仮想関数 。純粋仮想関数は、基本クラスで宣言された関数であり、基本クラスに関連する定義はありません。
  • 純粋仮想関数を含むクラスを使用して独自のオブジェクトを宣言することはできません。このようなクラスは抽象基本クラスとして知られています。
  • 基本クラスの主な目的は、派生クラスに特性を提供し、実行時ポリモーフィズムを実現するために使用される基本ポインターを作成することです。

純粋仮想関数は次のように定義できます。

 virtual void display() = 0; 

簡単な例を見てみましょう。

Javaの文字列メソッドへ
 #include using namespace std; class Base { public: virtual void show() = 0; }; class Derived : public Base { public: void show() { std::cout &lt;&lt; &apos;Derived class is derived from the base class.&apos; <show(); return 0; } < pre> <p> <strong>Output:</strong> </p> <pre> Derived class is derived from the base class. </pre> <p>In the above example, the base class contains the pure virtual function. Therefore, the base class is an abstract base class. We cannot create the object of the base class.</p></show();>

上記の例では、基本クラスに純粋仮想関数が含まれています。したがって、基本クラスは抽象基本クラスです。基本クラスのオブジェクトを作成することはできません。