C ++ เป็นภาษาเชิงวัตถุ ข้อมูลที่เป็นนามธรรมความหลากหลายการห่อหุ้มและการสืบทอดเป็นรากฐานที่สำคัญของ OOP ในโพสต์นี้เราจะเข้าใจว่ามรดกคืออะไร? ประเภทของการสืบทอดใน C ++ และแนวคิดที่จำเป็นทั้งหมดที่เกี่ยวข้องตั้งแต่เริ่มต้น ในท้ายที่สุดเราจะดูข้อเสียเปรียบของแนวคิดที่ทรงพลังนี้และพยายามแก้ไข
- มรดกใน C ++ คืออะไร
- มรดกเดียว
- มรดกหลายระดับ
- มรดกตามลำดับชั้น
- การสืบทอดหลายรายการใน C ++
- การสืบทอดแบบไฮบริดใน C ++
- ปัญหาเพชร
มรดกใน C ++ คืออะไร
การสืบทอดเป็นหนึ่งในแนวคิดที่ทรงพลังและใช้กันอย่างแพร่หลายใน C ++ หรือภาษาเชิงวัตถุอื่น ๆ การทำความเข้าใจแนวคิดนี้จำเป็นต้องมีความรู้เกี่ยวกับคลาสและวัตถุเล็กน้อย การใช้ Inheritance เราสามารถสร้างคลาสที่ประกอบด้วยวิธีการทั่วไปและแอตทริบิวต์ คลาสนี้สามารถสืบทอดโดยคลาสอื่นที่มีเมธอดเฉพาะเจาะจงมากขึ้น
การทำเช่นนี้ทำให้เราไม่ต้องเขียนฟังก์ชันเดิมซ้ำแล้วซ้ำอีกซึ่งช่วยประหยัดเวลาและเพิ่มความสามารถในการอ่านโค้ด
ไวยากรณ์:
คลาสที่ได้รับจากคลาส: access_type base_class {// class body}
คลาสพื้นฐาน: คลาสที่ประกอบด้วยเมธอดทั่วไปและแอ็ตทริบิวต์ทั้งหมดซึ่งคลาสอื่น ๆ สามารถแชร์เพื่อเพิ่มความสามารถในการอ่านโค้ดเรียกว่าคลาสพื้นฐาน
คลาสที่ได้รับ: คลาสที่ประกอบด้วยวิธีการที่เฉพาะเจาะจงมากขึ้นและสืบทอดคลาสเรียกว่าคลาสที่ได้รับ คลาสที่ได้รับยังสามารถเป็นคลาสพื้นฐานสำหรับคลาสที่ได้รับอื่น ๆ
ถ้าเราสร้างคลาส XYZ ด้วยคุณสมบัติและวิธีการบางอย่าง ตอนนี้นักเรียนในชั้นเรียนจะมีคุณลักษณะอื่น ๆ แต่จะรวมองค์ประกอบของชั้น XYZ ไว้ด้วยเช่นกันสำหรับชั้นเรียนคณะ มาดูแผนภาพกัน:
ดังนั้นชั้นเรียนของนักศึกษาและคณาจารย์จะสืบทอดจาก XYZ
ตัวระบุการเข้าถึง - เราเข้าใจว่าคลาสสามารถสืบทอดคลาสอื่นได้อย่างไร แต่บางคนอาจบอกว่าเป็นวิธีการที่ไม่ปลอดภัยเนื่องจากแอตทริบิวต์และวิธีการทั้งหมดของคลาสฐานหรือคลาสแม่ถูกแชร์กับคลาสลูกหรือคลาสที่ได้รับ ตัวอย่างเช่นหากคลาส 'ธนาคาร' สืบทอดโดยคลาส 'ลูกค้า' และ 'นักลงทุน' แอตทริบิวต์ของคลาส 'Bank' เช่น 'vaultpassword' ข้อมูลอื่น ๆ ที่เกี่ยวข้องกับลูกค้าและข้อมูลส่วนตัวจะแชร์กับ 'ลูกค้า' และ 'คลาสนักลงทุน' ซึ่งไม่ปลอดภัย
ในการแก้ปัญหาข้างต้น C ++ ใช้ตัวระบุการเข้าถึงเพื่อ จำกัด การเข้าถึงแอตทริบิวต์คลาสพื้นฐานไปยังคลาสที่ได้รับ ตัวระบุการเข้าถึงใน C ++ มีทั้งหมด 3 ประเภท
- สาธารณะ
- เอกชน
- มีการป้องกัน
ตารางด้านล่างนี้จะทำให้คุณเข้าใจได้ดีว่าข้อมูลประเภทใดที่สามารถเข้าถึงได้โดยคลาสที่ได้รับตามตัวระบุการเข้าถึงที่แตกต่างกัน
ตัวระบุการเข้าถึง | ข้อมูลสาธารณะ | ข้อมูลส่วนตัว | ข้อมูลที่ได้รับการคุ้มครอง |
เอกชน | ไม่ได้รับมรดก | ไม่ได้รับมรดก | ไม่ได้รับมรดก |
มีการป้องกัน | มีการป้องกัน | เอกชน | มีการป้องกัน |
สาธารณะ | สาธารณะ | เอกชน | มีการป้องกัน |
มรดกเดียว
Single Inheritance ถือได้ว่าเป็นการสืบทอดรูปแบบวานิลลาธรรมดา ในการสืบทอดเดี่ยวคลาสเดียวจะสืบทอดมาจากคลาสพื้นฐาน
#include using namespace std class Train {int Numberofwheels int Numberofcoaches public: void Traininfo (int n, int m) {Numberofwheels = n Numberofcoaches = m} void showinfo () {cout<กรณีของการสืบทอดนี้เรียกว่ามรดกหลายระดับ คลาสที่อยู่ระหว่างคลาสแรกและคลาสสุดท้ายเรียกอีกอย่างว่าคลาสพื้นฐานระดับกลางคุณคิดว่าคลาสสุดท้ายสามารถสืบทอดสมาชิกของคลาสเฟิร์สคลาสได้หรือไม่? ใช่มันทำได้ ข้อมูลขนาดใหญ่ Hadoop คืออะไร#include ใช้เนมสเปซคลาส std First {protected: int a public: void getinfofirst (int x) {a = x} void showinfofirst () {std :: cout<< 'Value of a = ' <เอาท์พุต:
ค่าของ a = 10
ค่า b = 20
ค่า c = 30
ค่า d = 50
มรดกตามลำดับชั้น
ปัญหาบางอย่างไม่สามารถแก้ไขได้ด้วยความช่วยเหลือของการสืบทอดระดับเดียวหรือหลายระดับ ในการสืบทอดตามลำดับชั้นมีมากกว่า 1 คลาสที่สืบทอดมาจากคลาสฐานเดียว
#include using namespace std class College {public: College () {cout<< 'We are in class College' << endl } } class Student: public College { } class Faculty: public College { } int main() { Student student Faculty faculty return 0 }เอาท์พุต:
เราอยู่ในชั้นเรียนวิทยาลัย
เราอยู่ในชั้นเรียนวิทยาลัย
การสืบทอดหลายรายการใน C ++
เราเห็นในการสืบทอดตามลำดับชั้นคลาสฐานหนึ่งมีคลาสที่ได้รับมากกว่าหนึ่งคลาส ในการสืบทอดหลายคลาสหนึ่งคลาสที่ได้รับมีคลาสพื้นฐานมากกว่าหนึ่งคลาส
#include using namespace std class One {protected: int a public: void getinfoOne (int x) {a = x}} class Two {protected: int b public: void getinfoTwo (int y) {b = y}} class Main: สาธารณะหนึ่งสาธารณะสอง {public: void Display () {std :: cout<< 'Value of a = ' < ณ จุดนี้เรามีความเข้าใจดีเกี่ยวกับการถ่ายทอดทางพันธุกรรมทุกประเภทที่ใช้ใน C ++ แต่เดี๋ยวก่อนถ้าเราต้องการใช้มรดก 2 ประเภทที่แตกต่างกัน? เป็นไปได้ไหม? ใช่มันเป็นไปได้ด้วยความช่วยเหลือของมรดกลูกผสม ในการสืบทอดลูกผสมเรารวมการสืบทอด 2 ประเภทที่แตกต่างกัน ตัวอย่างเช่น - การสืบทอดหลายระดับและหลายระดับการสืบทอดตามลำดับชั้นและหลาย ๆ เป็นต้น#include ใช้เนมสเปซคลาส std World {protected: int a public: void getinfoWorld (int x) {a = x}} class Continent: public World {protected: int b public: void getinfoContinent (int y) {b = y}} class Country {protected: int d public: void getinfoCountry (int m) {d = m}} class Australia: public Continent, public Country {public: void Display () {std :: cout<< 'Value of a = ' <มาทำความเข้าใจกับแผนภาพด้านบนซึ่งจะช่วยเราในการทำความเข้าใจปัญหาเพชร คลาส B และคลาส C สืบทอดมาจากคลาส A ดังนั้นทั้งคลาส A และคลาส B จึงมีคุณสมบัติและเมธอดของคลาส A หากคลาส D สืบทอดจากคลาส B เช่นเดียวกับคลาสซีคลาส D จะมีแอ็ตทริบิวต์ทั้งหมดของคลาส B และคลาส C นอกจากนี้ยังมีแอตทริบิวต์ทั้งหมดของคลาส A ที่สืบทอดมาจากคลาส B เช่นเดียวกับคลาส C ดังนั้นหากเราสร้างอ็อบเจ็กต์ของคลาส D และเรียกเมธอดของคลาส A จะมีการสร้างสถานการณ์ที่ไม่ชัดเจนและคอมไพเลอร์จะสับสนว่า ควรจัดคลาสเมธอด A จากคลาส B หรือคลาส D
เพื่อแก้ไขความไม่ชัดเจนนี้เราใช้แนวคิดที่เรียกว่าคลาสฐานเสมือน เมื่อเราสร้างคลาสฐานเป็นคลาสฐานเสมือนจะมีการสืบทอดเพียงสำเนาเดียวของคลาสนั้นโดยไม่คำนึงถึงจำนวนพา ธ ที่มีอยู่ระหว่างคลาสฐานเสมือนและคลาสที่ได้รับ
คลาส A {} คลาส B: สาธารณะเสมือน A {} คลาส C: สาธารณะเสมือน A {} คลาส D: C สาธารณะ, D สาธารณะ {}ด้วยเหตุนี้เราจึงมาถึงจุดสิ้นสุดของการสืบทอดนี้ในบทความ C ++ หากคุณต้องการเรียนรู้เพิ่มเติมโปรดดูไฟล์ โดย Edureka บริษัท การเรียนรู้ออนไลน์ที่เชื่อถือได้ หลักสูตรการฝึกอบรมและการรับรอง Java J2EE และ SOA ของ Edureka ได้รับการออกแบบมาเพื่อฝึกอบรมคุณสำหรับแนวคิด Java ทั้งหลักและขั้นสูงพร้อมกับกรอบงาน Java ต่างๆเช่น Hibernate & Spring
มีคำถามสำหรับเรา? โปรดระบุไว้ในส่วนความคิดเห็นของบล็อกนี้และเราจะติดต่อกลับโดยเร็วที่สุด