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

C ++の仮想基本クラスとは何ですか?


仮想基本クラスは、派生クラスに基本クラスの複数のコピーがある場合に使用されます。

サンプルコード

#include <iostream>
using namespace std;
class B {
   public: int b;
};

class D1 : public B {
   public: int d1;
};

class D2 : public B {
   public: int d2;
};

class D3 : public D1, public D2 {
   public: int d3;
};

int main() {
   D3 obj;

   obj.b = 40; //Statement 1, error will occur
   obj.b = 30; //statement 2, error will occur
   obj.d1 = 60;
   obj.d2 = 70;
   obj.d3 = 80;

   cout<< "\n B : "<< obj.b
   cout<< "\n D1 : "<< obj.d1;
   cout<< "\n D2: "<< obj.d2;
   cout<< "\n D3: "<< obj.d3;
}

上記の例では、D1とD2の両方がBを継承し、両方ともBの単一のコピーを持っています。ただし、D3はD1とD2の両方を継承しているため、D3にはBの2つのコピーがあります。1つはD1から、もう1つはD2からです。

上記の例のステートメント1と2は、コンパイラがD3のbの2つのコピーを区別できないため、エラーを生成します。

D3からBの複数のコピーを削除するには、D1とD3のBを仮想クラスとして継承する必要があります。

したがって、仮想基本クラスを使用する上記の例は、-

になります。

サンプルコード

#include<iostream>
using namespace std;
class B {
   public: int b;
};

class D1 : virtual public B {
   public: int d1;
};

class D2 : virtual public B {
   public: int d2;
};

class D3 : public D1, public D2 {
   public: int d3;
};

int main() {
   D3 obj;

   obj.b = 40; // statement 3
   obj.b = 30; // statement 4

   obj.d1 = 60;
   obj.d2 = 70;
   obj.d3 = 80;

   cout<< "\n B : "<< obj.b;
   cout<< "\n D1 : "<< obj.d1;
   cout<< "\n D2 : "<< obj.d2;
   cout<< "\n D3 : "<< obj.d3;
}

出力

B : 30
D1 : 60
D2 : 70
D3 : 80

これで、D3にはBのコピーが1つだけあり、ステートメント4はステートメント3で指定されたbの値を上書きします。


  1. C ++の変数のストレージクラスとは何ですか?

    ストレージクラスは、C ++プログラム内の変数や関数のスコープ(可視性)と存続期間を定義します。これらの指定子は、変更するタイプの前にあります。 C++プログラムで使用できる次のストレージクラスがあります。 自動 登録 静的 外部 可変 Cでは、自動ストレージクラス指定子を使用すると、自動ストレージを使用して変数を明示的に宣言できます。自動ストレージクラスは、ブロック内で宣言された変数のデフォルトです。自動ストレージを持つ変数xは、xが宣言されたブロックが終了すると削除されます。 自動ストレージクラス指定子は、ブロックで宣言された変数の名前または関数パラメーターの名前にのみ適用できます

  2. C#の基本クラスとは何ですか?

    クラスを作成するとき、プログラマーは、完全に新しいデータメンバーとメンバー関数を作成する代わりに、新しいクラスが既存のクラスのメンバーを継承するように指定できます。この既存のクラスは基本クラスと呼ばれ、新しいクラスは派生クラスと呼ばれます。 クラスは複数のクラスまたはインターフェースから派生させることができます。つまり、複数の基本クラスまたはインターフェースからデータと関数を継承できます。 以下は、C#の基本クラスの構文です- <access-specifier> class <base_class> {    ... } class <