ประเภทของการสืบทอดใน C ++ สิ่งที่คุณควรรู้

เผยแพร่แล้ว: 2023-04-05

คุณเคยสงสัยหรือไม่ว่าระบบซอฟต์แวร์ยอดนิยมบางตัวถูกสร้างขึ้นมาได้อย่างไร? ทั้งหมดนี้ต้องขอบคุณกลไกอันทรงพลังที่เรียกว่าการสืบทอดในการเขียนโปรแกรมเชิงวัตถุ (OOP) การสืบทอดช่วยให้โปรแกรมเมอร์สร้างคลาสใหม่ที่สร้างขึ้นจากคลาสที่มีอยู่ ทำให้สามารถใช้รหัสซ้ำและพัฒนาซอฟต์แวร์ได้อย่างมีประสิทธิภาพ จินตนาการว่าคุณกำลังสร้างระบบที่ต้องใช้หลายคลาส ซึ่งแต่ละคลาสจะมีลักษณะและพฤติกรรมร่วมกัน

แทนที่จะเขียนโค้ดเดิมซ้ำๆ คุณสามารถใช้การสืบทอดเพื่อสร้างคลาสพื้นฐานและรับคลาสใหม่จากคลาสนั้น ซึ่งช่วยประหยัดเวลาและความพยายามของคุณ

การสืบทอดไม่เพียงแต่มีประสิทธิภาพเท่านั้น แต่ยังมีประโยชน์หลากหลายอีกด้วย ใน C++ มีการสืบทอดหลายประเภท แต่ละประเภทมีประโยชน์และกรณีการใช้งานที่แตกต่างกัน

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

สารบัญ

ประเภทต่างๆ ของการสืบทอดใน C ++

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

มรดกเดียว

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

ตรวจสอบข้อมูลโค้ดด้านล่างเพื่อรับไวยากรณ์และความเข้าใจของการสืบทอดเดี่ยว:

// คลาสพื้นฐาน

สัตว์คลาส {

สาธารณะ:

เป็นโมฆะกิน () {

std::cout << “สัตว์กำลังกิน” << std::endl;

}

};

// คลาสที่ได้มา

สุนัขชั้น: สัตว์สาธารณะ {

สาธารณะ:

เป็นโมฆะเปลือก () {

std::cout << “สุนัขกำลังเห่า” << std::endl;

}

};

ในตัวอย่างนี้ เรามีคลาสพื้นฐานชื่อ Animal ที่มีสมาชิกฟังก์ชันเดียว eat()จากนั้นเรากำหนดคลาสที่ได้รับมา Dogที่ สืบทอดต่อสาธารณะจาก Animalสุนัข ยังมีเปลือกฟังก์ชันสมาชิกของตัวเอง ()ด้วยการใช้การสืบทอดแบบเดียวDog สามารถเข้าถึง ฟังก์ชัน eat()ของคลาส Animalและเพิ่มพฤติกรรมของมันเองด้วยฟังก์ชัน bark()

ควรใช้ Single Inheritance ใน C++ เมื่อใด

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

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

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

ต่อไปนี้เป็นตัวอย่างของการสืบทอดหลายรายการ:

// คลาสฐาน 1

รูปร่างคลาส {

สาธารณะ:

พื้นที่คู่เสมือน () = 0;

};

// คลาสฐาน 2

สีคลาส {

สาธารณะ:

std เสมือน :: string getColor () = 0;

};

// คลาสที่ได้มา

สี่เหลี่ยมผืนผ้าคลาส: รูปร่างสาธารณะ, สีสาธารณะ {

สาธารณะ:

พื้นที่สองเท่า () แทนที่ {

กลับความกว้าง * ความสูง;

}

std::string getColor() แทนที่ {

สีกลับ

}

ส่วนตัว:

ความกว้างสองเท่า = 5.0;

ความสูงสองเท่า = 3.0;

std::สีสตริง = "สีน้ำเงิน";

};

ในตัวอย่างนี้ เรามีคลาสพื้นฐานสองคลาส ได้แก่ Shape และ Color ซึ่งแต่ละคลาสมีฟังก์ชันเสมือนจากนั้นเรากำหนดสี่เหลี่ยมผืนผ้า คลาสที่ได้รับ ซึ่งสืบทอดมาจากทั้งรูปร่างและสีสี่เหลี่ยมผืนผ้า จะแทนที่ฟังก์ชันเสมือนของคลาสฐานทั้งสองเพื่อให้มีการใช้งานของตัวเอง ด้วยการใช้การสืบทอดหลายรายการRectangle สามารถสืบทอดคุณสมบัติของทั้งคลาสฐาน ShapeและColorเพื่อสร้างสี่เหลี่ยมผืนผ้าที่มีสีและพื้นที่เฉพาะ

เมื่อใดควรใช้การสืบทอดหลายรายการใน C ++

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

ด้วยการใช้การสืบทอดหลายรายการ คุณสามารถสร้างคลาสฐานที่เรียกว่าการควบคุม ที่มีฟังก์ชันการทำงานทั่วไป และได้รับการควบคุมแต่ละประเภทจากคลาสนั้น เช่นเดียวกับคลาสพื้นฐานอื่นๆ ที่มีฟังก์ชันการทำงานเฉพาะ

ในการสืบทอดแบบลำดับชั้น คลาสพื้นฐานเดียวจะถูกสืบทอดโดยคลาสที่ได้รับมาหลายคลาส เช่นเดียวกับการสืบทอดหลายรายการ คลาสที่ได้รับในการสืบทอดแบบลำดับชั้นจะได้รับสมาชิกข้อมูลสาธารณะและที่ได้รับการป้องกันทั้งหมด และฟังก์ชันสมาชิกของคลาสพื้นฐาน

นี่คือข้อมูลโค้ดที่จะช่วยให้คุณเข้าใจการใช้งานการสืบทอดลำดับชั้นใน C ++:

// คลาสพื้นฐาน

สัตว์คลาส {

สาธารณะ:

โมฆะเสมือน makeSound() = 0;

};

// สืบทอดคลาส 1

แมวคลาส: สัตว์สาธารณะ {

สาธารณะ:

เป็นโมฆะ makeSound () แทนที่ {

std::cout << “เหมียว” << std::endl;

}

};

// สืบทอดคลาส 2

สุนัขชั้น: สัตว์สาธารณะ {

สาธารณะ:

เป็นโมฆะ makeSound () แทนที่ {

std::cout << “วูฟ” << std::endl;

}

};

ในตัวอย่างนี้ เรามีคลาสพื้นฐานชื่อ Animal ที่มีฟังก์ชันเสมือน makeSound()จากนั้นเรากำหนดสองคลาสที่ได้รับมา Catและ Dog ซึ่งทั้งคู่สืบทอดมาจากAnimalแต่ละคลาสที่ได้รับจะแทนที่ ฟังก์ชันmakeSound() เพื่อจัดเตรียมการใช้งานของตนเองการใช้การสืบทอดลำดับชั้น เราสามารถสร้างสัตว์ประเภทต่างๆ ที่มีพฤติกรรมร่วมกันได้ เช่น การส่งเสียง

เมื่อใดควรใช้การสืบทอดลำดับชั้นใน C ++

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

ด้วยการใช้การสืบทอดลำดับชั้น คุณสามารถสร้างคลาสฐานที่เรียกว่าบัญชีที่มีแอตทริบิวต์และลักษณะการทำงานทั่วไป และสืบทอดประเภทบัญชีแต่ละประเภทเพื่อเพิ่มฟังก์ชันการทำงานเฉพาะ

มรดกหลายระดับ

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

นี่คือวิธีที่คุณสามารถใช้ การสืบทอดหลายระดับโดยทางโปรแกรมใน C ++:

// คลาสพื้นฐาน

รถคลาส {

สาธารณะ:

เป็นโมฆะ start() {

std::cout << “รถกำลังสตาร์ท” << std::endl;

}

};

//ชั้นกลาง

รถคลาส : รถสาธารณะ {

สาธารณะ:

โมฆะไดรฟ์ () {

std::cout << “รถกำลังขับ” << std::endl;

}

};

// คลาสที่ได้มา

รถสปอร์ตคลาส: รถสาธารณะ {

สาธารณะ:

เป็นโมฆะเร่ง () {

std::cout << “รถสปอร์ตกำลังเร่งความเร็ว” << std::endl;

}

};

เมื่อใดควรใช้การสืบทอดหลายระดับใน C++

ใช้การสืบทอดหลายระดับเมื่อคุณต้องการสร้างคลาสที่ได้รับมาซึ่งสืบทอดมาจากคลาสที่ได้รับมาอื่นและเพิ่มฟังก์ชันการทำงาน ตัวอย่างเช่น พิจารณาระบบซอฟต์แวร์ที่ต้องใช้ยานพาหนะประเภทต่างๆ เช่น รถยนต์ รถบรรทุก และรถจักรยานยนต์ ประเภทยานพาหนะเหล่านี้มีลักษณะและพฤติกรรมร่วมกันบางอย่าง เช่น ความเร็ว การเร่งความเร็ว และการเบรก

ด้วยการใช้การสืบทอดหลายระดับ คุณสามารถสร้างคลาสฐานที่เรียกว่า Vehicle ที่มีแอตทริบิวต์และพฤติกรรมทั่วไป และได้รับคลาสระดับกลาง เช่น CarและTruckจากคลาสนั้นเพื่อเพิ่มฟังก์ชันการทำงานเฉพาะ จากนั้นคุณสามารถรับคลาส SportsCar จาก คลาส Carเพื่อเพิ่มฟังก์ชันการทำงานที่เป็นเอกลักษณ์

การสืบทอดแบบไฮบริดคือการรวมกันของการสืบทอดสองประเภทขึ้นไป เรียกอีกอย่างว่าการสืบทอดเสมือน คลาสที่ได้รับในการสืบทอดแบบไฮบริดจะสืบทอดมาจากคลาสพื้นฐานหลายคลาส ซึ่งบางคลาสได้รับการสืบทอดผ่านหลายเส้นทาง สิ่งนี้สามารถสร้างลำดับชั้นการสืบทอดที่ซับซ้อนและอาจเป็นเรื่องยากที่จะทำความเข้าใจและดูแลรักษา

ตรวจสอบหลักสูตรการพัฒนาซอฟต์แวร์ ของ upGradเพื่อเพิ่มทักษะให้กับตัวคุณเอง

นี่คือตัวอย่าง การสืบทอดแบบไฮบริดใน C ++:

// คลาสฐาน 1

สัตว์คลาส {

สาธารณะ:

โมฆะเสมือน makeSound() = 0;

};

// คลาสฐาน 2

คลาส CanFly {

สาธารณะ:

โมฆะเสมือนบิน () = 0;

};

// คลาสฐาน 3

คลาส CanSwim {

สาธารณะ:

โมฆะเสมือนว่ายน้ำ () = 0;

};

// คลาสที่ได้มา

class Bat : สัตว์สาธารณะ CanFly สาธารณะ {

สาธารณะ:

เป็นโมฆะ makeSound () แทนที่ {

std::cout << “กรี๊ด!”<< std::endl;

}

โมฆะบิน () แทนที่ {

std::cout << “ค้างคาวกำลังบิน” << std::endl;

}

};

// คลาสที่ได้มา

เพนกวินคลาส: สัตว์สาธารณะ CanSwim สาธารณะ {

สาธารณะ:

เป็นโมฆะ makeSound () แทนที่ {

std::cout << “ฮุก!”<< std::endl;

}

ถือเป็นโมฆะว่ายน้ำ () แทนที่ {

std::cout << “เพนกวินกำลังว่ายน้ำ” << std::endl;

}

};

สำรวจหลักสูตรวิศวกรรมซอฟต์แวร์ยอดนิยมของเรา

วิทยาศาสตรมหาบัณฑิตสาขาวิทยาการคอมพิวเตอร์จาก LJMU & IIITB โปรแกรมใบรับรองความปลอดภัยทางไซเบอร์ของ Caltech CTME
Bootcamp การพัฒนาสแต็คเต็มรูปแบบ โปรแกรม PG ใน Blockchain
โปรแกรม Executive PG ในการพัฒนา Full Stack
ดูหลักสูตรทั้งหมดของเราด้านล่าง
หลักสูตรวิศวกรรมซอฟต์แวร์

เมื่อใดควรใช้การสืบทอดแบบไฮบริดใน C ++

นอกจากการสืบทอดสี่ประเภทที่กล่าวถึงก่อนหน้านี้แล้ว การสืบทอดแบบไฮบริดยังมีประโยชน์ในบางสถานการณ์ที่ต้องมีการสืบทอดหลายประเภท ใช้การสืบทอดแบบไฮบริดเพื่อรวมประโยชน์ของการสืบทอดหลายประเภท

ตัวอย่างเช่น พิจารณาระบบซอฟต์แวร์ที่ต้องใช้สัตว์ประเภทต่างๆ ซึ่งบางชนิดสามารถบินได้ ในขณะที่บางชนิดสามารถว่ายน้ำได้ คุณสามารถใช้การสืบทอดแบบไฮบริดเพื่อสร้างคลาสฐานที่เรียกว่า Animal และรับคลาสระดับกลางสองคลาส ได้แก่ CanFlyและCanSwimจากคลาสดังกล่าว สุดท้าย เมื่อใช้การสืบทอดแบบไฮบริด คุณจะได้คลาสBat และ Penguinจากคลาสระดับกลางทั้งสอง คลาสBat จะสืบทอดมาจาก AnimalและCanFlyในขณะที่ คลาสPenguinจะสืบทอดมาจากAnimalและCanSwimด้วยวิธีนี้ คุณสามารถสร้างสัตว์ประเภทต่าง ๆ ด้วยการผสมผสานความสามารถที่ไม่เหมือนใคร

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

อ่านบทความยอดนิยมของเราเกี่ยวกับการพัฒนาซอฟต์แวร์

ตรวจสอบหลักสูตรเทคโนโลยีฟรี ของเรา เพื่อรับความได้เปรียบเหนือการแข่งขัน

สิ่งสำคัญที่ต้องคำนึงถึงเมื่อใช้การสืบทอด:

แม้ว่าการสืบทอดจะเป็นกลไกที่ทรงพลังใน C++ แต่ก็มีปัจจัยบางประการที่ต้องพิจารณาเมื่อนำไปใช้งาน

  1. หลีกเลี่ยงลำดับชั้นการสืบทอดเชิงลึก : ลำดับชั้นการสืบทอดเชิงลึกอาจนำไปสู่รหัสที่ยากต่อการอ่าน ทำความเข้าใจ และบำรุงรักษารักษาลำดับชั้นการสืบทอดของคุณให้ตื้นที่สุดเพื่อปรับปรุงความสามารถในการอ่านและการบำรุงรักษาโค้ด
  2. ใช้ตัวแก้ไขการเข้าถึงอย่างชาญฉลาด: ตัวแก้ไขการเข้าถึง (สาธารณะ ป้องกัน และส่วนตัว) ควบคุมการมองเห็นของสมาชิกข้อมูลและฟังก์ชันของสมาชิกในชั้นเรียนใช้อย่างชาญฉลาดเพื่อหลีกเลี่ยงการเปิดเผยรายละเอียดการใช้งานที่ไม่ควรมองเห็นได้นอกชั้นเรียน
  3. หลีกเลี่ยงการสืบทอดเพชร: การสืบทอดเพชรเกิดขึ้นเมื่อคลาสสืบทอดจากสองคลาสที่สืบทอดมาจากคลาสพื้นฐานเดียวกันสิ่งนี้สามารถนำไปสู่ความคลุมเครือและควรหลีกเลี่ยงโดยทั่วไป
  4. หลีกเลี่ยงการใช้มรดกมากเกินไป: แม้ว่าการสืบทอดจะมีประโยชน์ แต่สิ่งสำคัญคือต้องหลีกเลี่ยงการใช้มากเกินไปในบางกรณี การจัดองค์ประกอบหรือรูปแบบการออกแบบอื่นๆ อาจเป็นทางเลือกที่ดีกว่า

สำรวจหลักสูตรการพัฒนาซอฟต์แวร์ฟรีของเรา

พื้นฐานของคลาวด์คอมพิวติ้ง พื้นฐาน JavaScript ตั้งแต่เริ่มต้น โครงสร้างข้อมูลและอัลกอริทึม
เทคโนโลยีบล็อกเชน ตอบสนองสำหรับผู้เริ่มต้น พื้นฐาน Java หลัก
ชวา Node.js สำหรับผู้เริ่มต้น JavaScript ขั้นสูง

ซื้อกลับบ้าน

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

หากคุณพบว่าบทความนี้น่าสนใจ คุณสามารถเพิ่มพูนความรู้ด้านการพัฒนาซอฟต์แวร์โดยการลงทะเบียนใน โปรแกรมการรับรอง DevOps ของ upGrad ที่นำเสนอโดยความร่วมมือกับ IIIT Bangalore โปรแกรมนี้ครอบคลุมแง่มุมต่างๆ ของการพัฒนาซอฟต์แวร์ รวมถึงการเขียนโค้ด การทดสอบ และการปรับใช้ และสามารถช่วยให้คุณกลายเป็นนักพัฒนาซอฟต์แวร์ที่มีทักษะในอุตสาหกรรม

เหตุใดการสืบทอดจึงมีความสำคัญในการเขียนโปรแกรม C ++

ด้วยการใช้มรดก โปรแกรมเมอร์สามารถประหยัดเวลาและความพยายามในการพัฒนาซอฟต์แวร์เพื่อสร้างระบบซอฟต์แวร์ที่ซับซ้อนในลักษณะที่เป็นระเบียบ ในขณะที่โปรแกรมเมอร์พยายามสร้างรหัสที่อ่านได้มากขึ้น กระบวนการเขียนโค้ดก็จะง่ายขึ้นไปอีกหลายอย่าง

อะไรคือสิ่งสำคัญที่ต้องจำเมื่อใช้การสืบทอดในการเขียนโปรแกรม C++

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

ฉันควรใช้การสืบทอดประเภทใดสำหรับโครงการพัฒนาซอฟต์แวร์ของฉัน

การเลือกประเภทการสืบทอดที่ถูกต้องนั้นขึ้นอยู่กับความต้องการเฉพาะของโครงการพัฒนาซอฟต์แวร์และเป้าหมายการออกแบบของคุณ การเลือกจากการสืบทอดประเภทต่างๆ ขึ้นอยู่กับข้อกำหนดโครงการของคุณทั้งหมด ดังนั้นควรทำการวิเคราะห์โดยละเอียดก่อนดำเนินการต่อ