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 สองชุด โดยชุดหนึ่งมาจาก D1 และอีกชุดหนึ่งมาจาก D2

ประโยคที่ 1 และ 2 ในตัวอย่างด้านบนจะทำให้เกิดข้อผิดพลาด เนื่องจากคอมไพเลอร์ไม่สามารถแยกความแตกต่างระหว่าง b สองชุดใน D3

หากต้องการลบ B หลายชุดออกจาก D3 เราต้องรับ B ใน D1 และ D3 เป็นคลาสเสมือน

ดังนั้น ตัวอย่างข้างต้นที่ใช้คลาสฐานเสมือนจะเป็น −

โค้ดตัวอย่าง

#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 เพียงชุดเดียว และคำสั่ง 4 จะเขียนทับค่าของ b ที่ระบุในคำสั่ง 3