สิ่งที่คุณต้องรู้เกี่ยวกับการสืบทอดใน C ++



บทความนี้จะให้ความรู้โดยละเอียดและครอบคลุมเกี่ยวกับ Inheritance ใน C ++ ประเภทต่างๆและวิธีการใช้งาน

C ++ เป็นภาษาเชิงวัตถุ ข้อมูลที่เป็นนามธรรมความหลากหลายการห่อหุ้มและการสืบทอดเป็นรากฐานที่สำคัญของ OOP ในโพสต์นี้เราจะเข้าใจว่ามรดกคืออะไร? ประเภทของการสืบทอดใน C ++ และแนวคิดที่จำเป็นทั้งหมดที่เกี่ยวข้องตั้งแต่เริ่มต้น ในท้ายที่สุดเราจะดูข้อเสียเปรียบของแนวคิดที่ทรงพลังนี้และพยายามแก้ไข

มรดกใน C ++ คืออะไร

การสืบทอดเป็นหนึ่งในแนวคิดที่ทรงพลังและใช้กันอย่างแพร่หลายใน C ++ หรือภาษาเชิงวัตถุอื่น ๆ การทำความเข้าใจแนวคิดนี้จำเป็นต้องมีความรู้เกี่ยวกับคลาสและวัตถุเล็กน้อย การใช้ Inheritance เราสามารถสร้างคลาสที่ประกอบด้วยวิธีการทั่วไปและแอตทริบิวต์ คลาสนี้สามารถสืบทอดโดยคลาสอื่นที่มีเมธอดเฉพาะเจาะจงมากขึ้น





การสืบทอดใน C ++

การทำเช่นนี้ทำให้เราไม่ต้องเขียนฟังก์ชันเดิมซ้ำแล้วซ้ำอีกซึ่งช่วยประหยัดเวลาและเพิ่มความสามารถในการอ่านโค้ด



ไวยากรณ์:

คลาสที่ได้รับจากคลาส: access_type base_class {// class body}

คลาสพื้นฐาน: คลาสที่ประกอบด้วยเมธอดทั่วไปและแอ็ตทริบิวต์ทั้งหมดซึ่งคลาสอื่น ๆ สามารถแชร์เพื่อเพิ่มความสามารถในการอ่านโค้ดเรียกว่าคลาสพื้นฐาน

คลาสที่ได้รับ: คลาสที่ประกอบด้วยวิธีการที่เฉพาะเจาะจงมากขึ้นและสืบทอดคลาสเรียกว่าคลาสที่ได้รับ คลาสที่ได้รับยังสามารถเป็นคลาสพื้นฐานสำหรับคลาสที่ได้รับอื่น ๆ



ถ้าเราสร้างคลาส XYZ ด้วยคุณสมบัติและวิธีการบางอย่าง ตอนนี้นักเรียนในชั้นเรียนจะมีคุณลักษณะอื่น ๆ แต่จะรวมองค์ประกอบของชั้น XYZ ไว้ด้วยเช่นกันสำหรับชั้นเรียนคณะ มาดูแผนภาพกัน:

ดังนั้นชั้นเรียนของนักศึกษาและคณาจารย์จะสืบทอดจาก XYZ

ตัวระบุการเข้าถึง - เราเข้าใจว่าคลาสสามารถสืบทอดคลาสอื่นได้อย่างไร แต่บางคนอาจบอกว่าเป็นวิธีการที่ไม่ปลอดภัยเนื่องจากแอตทริบิวต์และวิธีการทั้งหมดของคลาสฐานหรือคลาสแม่ถูกแชร์กับคลาสลูกหรือคลาสที่ได้รับ ตัวอย่างเช่นหากคลาส 'ธนาคาร' สืบทอดโดยคลาส 'ลูกค้า' และ 'นักลงทุน' แอตทริบิวต์ของคลาส 'Bank' เช่น 'vaultpassword' ข้อมูลอื่น ๆ ที่เกี่ยวข้องกับลูกค้าและข้อมูลส่วนตัวจะแชร์กับ 'ลูกค้า' และ 'คลาสนักลงทุน' ซึ่งไม่ปลอดภัย

ในการแก้ปัญหาข้างต้น C ++ ใช้ตัวระบุการเข้าถึงเพื่อ จำกัด การเข้าถึงแอตทริบิวต์คลาสพื้นฐานไปยังคลาสที่ได้รับ ตัวระบุการเข้าถึงใน C ++ มีทั้งหมด 3 ประเภท

  1. สาธารณะ
  2. เอกชน
  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

มีคำถามสำหรับเรา? โปรดระบุไว้ในส่วนความคิดเห็นของบล็อกนี้และเราจะติดต่อกลับโดยเร็วที่สุด