คลาสฐานเสมือนจะใช้เมื่อคลาสที่ได้รับมีคลาสฐานหลายชุด
โค้ดตัวอย่าง
#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