C ++で仮想関数を実装する方法は?



この記事では、C ++の仮想関数であるさらに別のプログラミング概念を紹介します。コンセプトはデモンストレーションによってサポートされます。

の仮想関数 C ++ は、派生クラスで再定義する基本クラス内のメンバー関数です。この記事は、概念を詳細に調査するのに役立ちます。この記事では、次のポインタについて説明します。

それでは、C ++の仮想関数に関するこの記事から始めましょう。





仮想関数とは何ですか?

仮想関数は、派生クラスで再定義する基本クラス内のメンバー関数です。 virtualキーワードを使用して宣言されます。仮想関数を含むクラスが継承されると、派生クラスはそれ自体のニーズに合わせて仮想関数を再定義します。

C ++の仮想関数に関するこの記事に進む



C ++の仮想関数のルール:

  • これらは常に基本クラスで定義され、派生クラスでオーバーライドされますが、派生クラスでオーバーライドする必要はありません。
  • 仮想関数は、クラスのパブリックセクションで宣言する必要があります。
  • それらを静的にすることはできません。また、フレンド関数を別のクラスの仮想関数にすることもできません。
  • 実行時のポリモーフィズムを実現するには、ポインターを使用して仮想関数にアクセスする必要があります。

C ++の仮想関数に関するこの記事に進みます。

バインディングとは何ですか?

関数のバインドとは、関数呼び出しがある場合は常に、コンパイラーがどの関数定義に一致するかを知る必要があることを意味します。これは、各関数宣言の署名と実行される割り当てによって異なります。また、コンパイラは、関数呼び出しと正しい定義の選択との間でこの一致が発生することを知る必要があります。

C ++の仮想関数に関するこの記事に進む



早期バインディング

アーリーバインディングは、さまざまな関数呼び出しに一致する決定がコンパイル時に行われ、コンパイラーがリンクをアドレスに直接関連付ける現象です。静的バインディングまたはコンパイル時バインディングとも呼ばれます。

  • 私たちが知っているように、私たちは高級言語でコードを書きます
  • 次に、コンパイラーはこれをコンピューターが理解できる低水準言語に変換します。ほとんどの場合、コンパイル時の機械語です。
  • 初期バインディングでは、コンパイラは関数宣言命令のアドレスを関数呼び出し命令に直接提供します
  • したがって、名前が示すように、バインディングはプログラムが実行される前の非常に早い段階で発生します。

#include using namespace std class Animals {public:void sound(){cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <sound()//アーリーバインディングは0を返す}

出力

出力-C ++の仮想関数-Edureka

明確化 イオン
この例では、親クラスAnimalsへのポインタaを作成しました。次に、a =&cと書くことにより、ポインタ「a」はクラスCatsのオブジェクトcを参照し始めました。
a-> sound()–ポインタ 'a'によって両方のクラスに存在する関数sound()を呼び出すと、ポインタがクラスCatsのオブジェクトを参照している場合でも、親クラスの関数が呼び出されます。 。

c ++配列をソートする方法

これは早期バインディングによるものです。 「a」は、子クラスのオブジェクトを参照する親クラスのポインタであることがわかっています。早期バインディングはコンパイル時に行われるため、コンパイラーは「a」が親クラスのポインターであることを確認すると、オブジェクトポインターを検索せずに、呼び出しを親クラスの「sound()」関数と照合しました。を参照しています。

C ++の仮想関数に関するこの記事に進む

遅延バインディング

遅延バインディングでは、コンパイラは実行時にオブジェクトを識別し、関数呼び出しを正しい関数と照合します。動的バインディングまたはランタイムバインディングとも呼ばれます。

上記の問題の遅延バインディングは、基本クラスで仮想キーワードを使用することで解決できます。上記の例自体を使用して、仮想キーワードを追加するだけで、これがどのように発生するかを見てみましょう。

配列c ++を降順で並べ替える
#include using namespace std class Animals {public:virtual void sound(){cout<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <sound()は0を返します}

出力

説明
ここでは、基本クラスの関数sound()が仮想化されているため、コンパイラーはこの関数の遅延バインディングを実行します。これで、sound()関数の関数呼び出しは、実行時に関数定義と照合されます。コンパイラは、ポインタ「a」を派生クラスCatsのオブジェクト「c」を参照するものとして識別するようになったため、クラスCatsのsound()関数を呼び出します。

C ++の仮想関数に関するこの記事に進む

純粋仮想関数

C ++の純粋仮想関数は、実装がない仮想関数であり、宣言するだけです。純粋仮想関数は、宣言で0を割り当てることによって宣言されます。

仮想ボイドサウンド()= 0

ここで、sound()は純粋な仮想機能です。

C ++の仮想関数に関するこの記事に進む

抽象クラス

抽象クラスは、1つ以上の純粋仮想関数を持つクラスとして定義されます。上で説明したように、純粋仮想関数は、実装がないとマークされた仮想メンバー関数です。基本クラスを含め、クラスで提供される情報を使用して実装することはできません。抽象クラスは、抽象基本クラスとも呼ばれます。

#include using namespace std class Employee //抽象基本クラス{virtualint getSalary()= 0 //純粋な仮想関数} class Employee_1:public Employee {int salary public:Employee_1(int s){salary = s} int getSalary() {return salary}} class Employee_2:public Employee {int salary public:Employee_2(int t){salary = t} int getSalary(){return salary}} int main(){Employee_1 e1(5000)Employee_2 e2(3000)int a、ba = e1.getSalary()b = e2.getSalary()cout<< 'Salary of Developer : ' << a << endl cout << 'Salary of Driver : ' << b << endl return 0 } 

出力

説明
Employeeクラスの「getSalary()」関数は純粋仮想関数です。 Employeeクラスには純粋仮想関数が含まれているため、抽象基本クラスです。
純粋仮想関数はサブクラスで定義されているため、関数「getSalary()」はクラスEmployeeの両方のサブクラス、つまりEmployee_1とEmployee_2で定義されています。

C ++の仮想関数に関するこの記事に進む

仮想関数の例

#include using namespace std class base {public:void function_1(){cout<< 'base class function 1n' } virtual void function_2() { cout << 'base class function 2n' } virtual void function_3() { cout << 'base class function 3n' } virtual void function_4() { cout << 'base class function 4n' } } class derived : public base { public: void function_1() { cout << 'derived class function 1n' } void function_2() { cout << 'derived class function 2n' } void function_4(int x) { cout function_2()ptr-> function_3()ptr-> function_4()}

出力

gitとgithubの違い

説明
function_1()関数呼び出しの場合、関数の基本クラスバージョンが呼び出され、function_2()が派生クラスでオーバーライドされるため、派生クラスバージョンが呼び出されます。function_3()は派生クラスでオーバーライドされず、仮想関数であるため、基本クラスバージョンが呼び出されます。同様に、function_4()はオーバーライドされないため、基本クラスのバージョンが呼び出されます。

これで、「C ++の仮想関数」に関するこの記事は終わりです。詳細を知りたい場合は、 信頼できるオンライン学習会社であるEdurekaによる。 EdurekaのJavaJ2EEおよびSOAトレーニングおよび認定コースは、Hibernate&SpringなどのさまざまなJavaフレームワークに加えて、コアJavaコンセプトと高度なJavaコンセプトの両方についてトレーニングするように設計されています。

質問がありますか?このブログのコメントセクションでそれについて言及してください。できるだけ早くご連絡いたします。