ประเภทของการสืบทอดใน 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++ แต่ก็มีปัจจัยบางประการที่ต้องพิจารณาเมื่อนำไปใช้งาน
- หลีกเลี่ยงลำดับชั้นการสืบทอดเชิงลึก : ลำดับชั้นการสืบทอดเชิงลึกอาจนำไปสู่รหัสที่ยากต่อการอ่าน ทำความเข้าใจ และบำรุงรักษารักษาลำดับชั้นการสืบทอดของคุณให้ตื้นที่สุดเพื่อปรับปรุงความสามารถในการอ่านและการบำรุงรักษาโค้ด
- ใช้ตัวแก้ไขการเข้าถึงอย่างชาญฉลาด: ตัวแก้ไขการเข้าถึง (สาธารณะ ป้องกัน และส่วนตัว) ควบคุมการมองเห็นของสมาชิกข้อมูลและฟังก์ชันของสมาชิกในชั้นเรียนใช้อย่างชาญฉลาดเพื่อหลีกเลี่ยงการเปิดเผยรายละเอียดการใช้งานที่ไม่ควรมองเห็นได้นอกชั้นเรียน
- หลีกเลี่ยงการสืบทอดเพชร: การสืบทอดเพชรเกิดขึ้นเมื่อคลาสสืบทอดจากสองคลาสที่สืบทอดมาจากคลาสพื้นฐานเดียวกันสิ่งนี้สามารถนำไปสู่ความคลุมเครือและควรหลีกเลี่ยงโดยทั่วไป
- หลีกเลี่ยงการใช้มรดกมากเกินไป: แม้ว่าการสืบทอดจะมีประโยชน์ แต่สิ่งสำคัญคือต้องหลีกเลี่ยงการใช้มากเกินไปในบางกรณี การจัดองค์ประกอบหรือรูปแบบการออกแบบอื่นๆ อาจเป็นทางเลือกที่ดีกว่า
สำรวจหลักสูตรการพัฒนาซอฟต์แวร์ฟรีของเรา
พื้นฐานของคลาวด์คอมพิวติ้ง | พื้นฐาน JavaScript ตั้งแต่เริ่มต้น | โครงสร้างข้อมูลและอัลกอริทึม |
เทคโนโลยีบล็อกเชน | ตอบสนองสำหรับผู้เริ่มต้น | พื้นฐาน Java หลัก |
ชวา | Node.js สำหรับผู้เริ่มต้น | JavaScript ขั้นสูง |
ซื้อกลับบ้าน
โดยสรุป การสืบทอดเป็นแนวคิดที่สำคัญในการเขียนโปรแกรม C++ ที่นักเรียนเขียนโปรแกรมทุกคนควรเชี่ยวชาญ เมื่อเข้าใจประเภทต่างๆ ของการสืบทอดและกรณีการใช้งาน คุณจะสามารถสร้างโค้ดที่มีประสิทธิภาพ เป็นระเบียบ และบำรุงรักษาได้ ซึ่งจะกลายเป็นนักพัฒนาซอฟต์แวร์ที่ดีขึ้น
หากคุณพบว่าบทความนี้น่าสนใจ คุณสามารถเพิ่มพูนความรู้ด้านการพัฒนาซอฟต์แวร์โดยการลงทะเบียนใน โปรแกรมการรับรอง DevOps ของ upGrad ที่นำเสนอโดยความร่วมมือกับ IIIT Bangalore โปรแกรมนี้ครอบคลุมแง่มุมต่างๆ ของการพัฒนาซอฟต์แวร์ รวมถึงการเขียนโค้ด การทดสอบ และการปรับใช้ และสามารถช่วยให้คุณกลายเป็นนักพัฒนาซอฟต์แวร์ที่มีทักษะในอุตสาหกรรม
เหตุใดการสืบทอดจึงมีความสำคัญในการเขียนโปรแกรม C ++
ด้วยการใช้มรดก โปรแกรมเมอร์สามารถประหยัดเวลาและความพยายามในการพัฒนาซอฟต์แวร์เพื่อสร้างระบบซอฟต์แวร์ที่ซับซ้อนในลักษณะที่เป็นระเบียบ ในขณะที่โปรแกรมเมอร์พยายามสร้างรหัสที่อ่านได้มากขึ้น กระบวนการเขียนโค้ดก็จะง่ายขึ้นไปอีกหลายอย่าง
อะไรคือสิ่งสำคัญที่ต้องจำเมื่อใช้การสืบทอดในการเขียนโปรแกรม C++
เมื่อใช้การสืบทอดในการเขียนโปรแกรม C++ สิ่งสำคัญคือต้องคำนึงถึงสิ่งสำคัญบางอย่าง เช่น หลีกเลี่ยงลำดับชั้นการสืบทอดที่ลึก ใช้ตัวแก้ไขการเข้าถึงอย่างชาญฉลาด หลีกเลี่ยงการสืบทอดเพชร และไม่ใช้การสืบทอดมากเกินไป
ฉันควรใช้การสืบทอดประเภทใดสำหรับโครงการพัฒนาซอฟต์แวร์ของฉัน
การเลือกประเภทการสืบทอดที่ถูกต้องนั้นขึ้นอยู่กับความต้องการเฉพาะของโครงการพัฒนาซอฟต์แวร์และเป้าหมายการออกแบบของคุณ การเลือกจากการสืบทอดประเภทต่างๆ ขึ้นอยู่กับข้อกำหนดโครงการของคุณทั้งหมด ดังนั้นควรทำการวิเคราะห์โดยละเอียดก่อนดำเนินการต่อ