คลาสฐานเสมือน
ในกระบวนการสืบทอดที่ฉันได้เรียนรู้ก่อนหน้านี้ ฉันสงสัยว่าคุณเคยคิดถึงสถานการณ์นี้หรือไม่: ในความสัมพันธ์แบบสืบทอดหลายรายการ ถ้าคลาสที่ได้รับสืบทอดมาจากคลาสพาเรนต์สองคลาส และคลาสพาเรนต์ทั้งสองคลาสนี้เกิดขึ้นเพื่อสืบทอดจากคลาสที่สืบทอดมาจากฐานเดียว ระดับ. นั่นคงจะลำบากเพราะคุณอาจได้รับสำเนาของสมาชิกคนเดียวกันสองชุด!
สิ่งนี้นำไปสู่สิ่งที่เรียกว่าปัญหา ความคลุมเครือ มาเริ่มเรียนกันดีกว่า!
ก่อนอื่นให้ฉันยกตัวอย่างที่แสดงให้เห็นถึงมรดกหลายรายการประเภทนี้! ฉันคิดถึงเรื่องนี้และเกิดตัวอย่างนี้: เคยมีครอบครัวที่ร่ำรวยคนหนึ่ง มีลูกชายสองคน ต่อมามีลูกชายสองคน ไม่กี่ปีพวกเขาเติบโตขึ้นและนายชายก็แก่แล้ว ดังนั้นเขาจึงจับคู่กุญแจอีกสองดอกและมอบให้กับลูกชายสองคนของเขาตามลำดับ และปล่อยให้พวกเขาดูแลธุรกิจของครอบครัว หลังจากนั้นหลายปี ลูกชายทั้งสองก็แต่งงานกัน และมีเด็กชายและเด็กหญิงตามลำดับ คนที่เรียกว่ามีความเจริญรุ่งเรืองและต่อมาพวกเขาก็เติบโตขึ้นและถึงเวลามอบกุญแจแล้ว ในสมัยโบราณกุญแจนั้นถูกส่งต่อไปยังเด็กชายอย่างแน่นอนดังนั้นแน่นอนว่ากุญแจนั้นมอบให้กับหลานชายที่ คราวนี้ พ่อของหลานชายและลุงของเขา (คือ ลูกชายสองคนของเจ้าของเดิม) ทุกคนต้องมอบกุญแจให้หลานชาย ดังนั้น เขาจึงมีกุญแจสองดอก หลานชายตัวน้อยมองดูกุญแจสองดอกในมือแล้วพูดว่า “ดอกเดียวก็เพียงพอแล้ว! สองดอก... นี่มันเสียเปล่าเหรอ?”
หลังจากอ่านเรื่องนี้แล้ว ทุกคนจะเข้าใจมรดกได้ง่ายขึ้น ซุนวูเป็นคลาสที่ได้รับมาสุดท้ายเพราะเขาสืบทอดมาจากคลาสที่ได้รับมาสองคลาส และคลาสที่ได้รับทั้งสองคลาสนี้มีสมาชิกร่วมกัน (คีย์ เพราะทั้งสองคลาสสืบทอดคลาสพื้นฐานเดียวกัน - คุณปู่) คลาสที่ได้รับมาล่าสุดของซุนวูมีสมาชิกที่ซ้ำกันสองคน (กุญแจ) ซึ่งเป็นที่มาของความคลุมเครือ!
ด้านล่างนี้ เราทำตามตัวอย่างนี้และเขียนโค้ดโดยเฉพาะ คุณสามารถอ้างอิงถึงมันได้:
/************************************//Des: การสาธิตการสอน C++//Author: Huang/ /ลิขสิทธิ์:www.dotcpp.com//วันที่:2017/12/18********************************* * *******/#include<iostream>usingnamespacestd;classGrandfather{public:intkey;public:};classFather1:publicGrandfather{};classFather2:publicGrandfather{};classGrandson:publicFather1,publicFather2{};intmain(){ หลานชายA ;//A.key=9;return0;}
รหัสเป็นเพียงการแสดงเรื่องราว เพื่อความสะดวกในการอธิบาย คลาสที่กำหนดทั้งสี่จะว่างเปล่า เพียงมุ่งเน้นไปที่ความสัมพันธ์ทางมรดก นั่นคือคลาส Grandson จะสืบทอดคลาสของพ่อ 2 คลาส และจะมีสมาชิกคีย์ 2 ตัวในขณะนี้ โปรดทราบว่าคีย์ดังกล่าวได้รับการประกาศให้เป็นประเภทสาธารณะ เมื่อพยายามกำหนดค่าในฟังก์ชันหลัก จะมีข้อความแสดงข้อผิดพลาด "ไม่ซ้ำกัน คลุมเครือ" นั่นคือเรียกว่าปัญหาความคลุมเครือเกิดขึ้นและทุกคนสามารถเข้าใจได้ดี
แล้วจะหลีกเลี่ยงปัญหานี้ได้อย่างไร? นี่คือเวลาที่คุณต้องการใช้ คลาสฐานเสมือน ! สิ่งที่เรียกว่าคลาสฐานเสมือนคือการแก้ไขด้วย คลาสเสมือน ก่อนที่จะสืบทอดประเภทสาธารณะเมื่อสืบทอด ตัวอย่างเช่น ในตัวอย่างนี้ คลาสพ่อจำเป็นต้องเพิ่มคลาสเสมือนเพิ่มเติมเท่านั้นเมื่อสืบทอดคลาสปู่ ในขณะนี้ คลาสที่ได้รับมา คลาสและคลาสพื้นฐานจะรักษาสำเนาของอ็อบเจ็กต์คลาสพื้นฐานเท่านั้น หลีกเลี่ยงการคัดลอกหลายชุดและความคลุมเครือ
วิธีการกำหนดคือการเพิ่มการประกาศเสมือนเมื่อได้รับคลาสพาเรนต์ทั้งสอง:
คลาสFather1:virtualpublicปู่คลาสFather2:virtualpublicปู่
ส่วนที่เหลือยังคงไม่เปลี่ยนแปลง คุณสามารถทดสอบบนคอมพิวเตอร์ของคุณเองเพื่อทำความเข้าใจการสร้างความคลุมเครือและการใช้งานคลาสพื้นฐานเสมือน