Computer >> Máy Tính >  >> Lập trình >> C ++

Lớp cơ sở ảo trong C ++ là gì?

Lớp cơ sở ảo được sử dụng khi một lớp dẫn xuất có nhiều bản sao của lớp cơ sở.

Mã mẫu

#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;
}

Trong ví dụ trên, cả D1 &D2 đều kế thừa B, cả hai đều có một bản sao duy nhất của B. Tuy nhiên, D3 kế thừa cả D1 &D2, do đó D3 có hai bản sao của B, một từ D1 và một từ D2.

Câu lệnh 1 và 2 trong ví dụ trên sẽ tạo ra lỗi, vì trình biên dịch không thể phân biệt giữa hai bản sao của b trong D3.

Để loại bỏ nhiều bản sao của B khỏi D3, chúng ta phải kế thừa B trong D1 và D3 dưới dạng lớp ảo.

Vì vậy, ví dụ trên sử dụng lớp cơ sở ảo sẽ là -

Mã mẫu

#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;
}

Đầu ra

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

Bây giờ, D3 chỉ có một bản sao của B và câu lệnh 4 sẽ ghi đè giá trị của b, được đưa ra trong câu lệnh 3.