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

C++の非仮想関数内で仮想関数が呼び出されるとどうなりますか


このセクションでは、C++の仮想クラスに関する興味深い事実について説明します。最初に2つのケースを確認してから、事実を分析します。

  • 最初は、仮想関数を使用せずにプログラムを実行します。

  • 非仮想関数の下で任意の仮想関数を使用してプログラムを実行します。

理解を深めるために、次の実装を見てみましょう-

#include <iostream>
using namespace std;
class BaseClass {
public:
   void display(){
      cout << "Print function from the base class" << endl;
   }
   void call_disp(){
      cout << "Calling display() from derived" << endl;
      this -> display();
   }
};
class DerivedClass: public BaseClass {
public:
   void display() {
      cout << "Print function from the derived class" << endl;
   }
   void call_disp() {
      cout << "Calling display() from derived" << endl ;
      this -> display();
   }
};
int main() {
   BaseClass *bp = new DerivedClass;
   bp->call_disp();
}

出力

Calling display() from base class
Print function from the base class

出力から、仮想関数が非仮想関数内で呼び出された場合でも、ポリモーフィックな動作が機能することがわかります。呼び出される関数は、実行時にvptrとvtableを適用して決定されます。

  • vtable −これは、クラスごとに維持される関数ポインタのテーブルです。

  • vptr −これは、オブジェクトインスタンスごとに維持されるvtableへのポインタです。


  1. C ++の矢印演算子とは何ですか?

    ドットと矢印の演算子は、どちらもC++でクラスのメンバーにアクセスするために使用されます。それらはさまざまなシナリオで使用されます。 C ++では、クラス、構造体、または共用体として宣言された型は「クラス型」と見なされます。したがって、以下はそれらの両方を指します。 a.bは、bがオブジェクトのメンバー(またはオブジェクトへの参照[1])である場合にのみ使用されます。したがって、a.bの場合、aは常にクラスの実際のオブジェクト(またはオブジェクトへの参照)になります。 a→bは基本的に(* a).bの省略表記です。つまり、aがオブジェクトへのポインタである場合、a→bはポイントするオブジ

  2. C ++のドット演算子とは何ですか?

    ドットと矢印の演算子は、どちらもC++でクラスのメンバーにアクセスするために使用されます。それらはさまざまなシナリオで使用されます。 C ++では、クラス、構造体、または共用体として宣言された型は「クラス型」と見なされます。したがって、以下はそれらの両方を指します。 a.bは、bがオブジェクトのメンバー(またはオブジェクトへの参照[1])である場合にのみ使用されます。したがって、a.bの場合、aは常にクラスの実際のオブジェクト(またはオブジェクトへの参照)になります。 a→bは基本的に(* a).bの省略表記です。つまり、aがオブジェクトへのポインタである場合、→bはポイントするオブジェ