การสืบทอดเดี่ยวและการสืบทอดหลายรูปแบบ
จำลองความสัมพันธ์แบบ is-a ด้วยการสืบทอดเดี่ยว และจัดการข้อควรระวังของการสืบทอดหลายรูปแบบ
การสืบทอดเดี่ยวและการสืบทอดหลายรูปแบบ เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
การสืบทอดคืออะไร
การสืบทอดทำให้คลาสหนึ่ง (คลาส derived) นำคลาสอีกคลาสหนึ่ง (คลาส base) มาใช้ซ้ำและต่อยอดได้ โดยใช้จำลองความสัมพันธ์แบบ "เป็น"
class Animal {
public:
void breathe() { std::cout << "breathing\n"; }
};
class Dog : public Animal {
public:
void bark() { std::cout << "Woof!\n"; }
};การสืบทอดแบบสาธารณะ
ใช้ public เพื่อจำลองความสัมพันธ์แบบ "เป็น" — Dog เป็น Animal สมาชิกจะคงระดับการเข้าถึงเดิมไว้ในคลาส derived
การสืบทอดแบบป้องกันและส่วนตัว
การสืบทอดแบบ protected และ private ใช้จำลองความสัมพันธ์แบบ "สร้างขึ้นโดยอาศัย" ซึ่งไม่ค่อยได้ใช้ โดยทั่วไปควรเลือกการประกอบสำหรับกรณีเหล่านี้
การเข้าถึงสมาชิกของ Base
คลาส derived สามารถใช้สมาชิก public หรือ protected ของคลาส base ได้โดยตรง
Dog d;
d.breathe(); // inherited from Animal
d.bark(); // own memberลำดับของตัวสร้าง
ตัวสร้างของคลาส base จะทำงานก่อนตัวสร้างของคลาส derived ใช้รายการกำหนดค่าเริ่มต้นสมาชิกเพื่อส่งอาร์กิวเมนต์ไปยังคลาส base
class Pet : public Animal {
std::string name_;
public:
Pet(std::string n) : Animal(), name_(std::move(n)) {}
};ลำดับของตัวทำลาย
ตัวทำลายจะทำงานในลำดับย้อนกลับ — derived ก่อน แล้วจึงเป็น base กำหนดตัวทำลายของ base เป็น virtual หากคุณลบวัตถุผ่านตัวชี้ไปยัง base
การสืบทอดหลายทาง
C++ อนุญาตให้คลาสสืบทอดจาก base มากกว่าหนึ่งคลาสได้ ควรใช้อย่างระมัดระวัง เพราะทำให้การออกแบบซับซ้อนขึ้น
class Printable { public: virtual void print() = 0; };
class Serializable { public: virtual std::string serialize() = 0; };
class Document : public Printable, public Serializable {
// implements both interfaces
};ปัญหาเพชร
หากคลาส base สองคลาสมี base ร่วมกัน คลาส derived จะมีสำเนาของ base นั้นสองชุด ให้แก้ปัญหาด้วยการสืบทอดแบบเสมือน
class A {};
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {}; // D has ONE A, not twoต้นทุนของการสืบทอดแบบเสมือน
คลาสฐานเสมือนเพิ่มค่าใช้จ่าย — มีตัวชี้เพิ่มหนึ่งตัวต่อวัตถุ และมีการอ้างอิงทางอ้อมเพิ่มหนึ่งครั้งเมื่อเข้าถึงสมาชิกของ base แต่ละตัว หลีกเลี่ยงเมื่อทำได้
การประกอบเทียบกับการสืบทอด
บ่อยครั้ง การประกอบแบบ "มี" จะง่ายกว่าการสืบทอดแบบ "เป็น" Car มี Engine — อย่าสืบทอด Car จาก Engine
class Engine { /* ... */ };
class Car {
Engine engine_; // composition
};การสืบทอดอินเทอร์เฟซเทียบกับการสืบทอดการทำงาน
การใช้งานที่พบบ่อยมีสองแบบ:
- อินเทอร์เฟซ — สืบทอดจาก base แบบเสมือนล้วนเพื่อทำตามสัญญา
- การทำงาน — สืบทอดเพื่อใช้โค้ดซ้ำ (CRTP, มิกซ์อิน)
ควรใช้การสืบทอดเมื่อใด
ใช้การสืบทอดเมื่อ:
- มีความสัมพันธ์แบบ "เป็น" อยู่จริง
- ต้องการพหุสัณฐานขณะทำงานผ่านฟังก์ชันเสมือน
- คลาส base ได้รับการออกแบบมาเพื่อรองรับการสืบทอด
ตรวจสอบความเข้าใจ
เทคนิคใดป้องกันไม่ให้มีสำเนาของคลาส base ร่วมกันสองชุดเมื่อใช้การสืบทอดหลายทาง
สรุปทบทวน
การสืบทอดแบบสาธารณะใช้จำลองความสัมพันธ์แบบ "เป็น" C++ อนุญาตให้สืบทอดหลายทางได้ แต่ปัญหาเพชรต้องแก้ด้วยการสืบทอดแบบเสมือน สำหรับความสัมพันธ์แบบ "มี" และการใช้โค้ดซ้ำ ควรเลือกการประกอบ
คำถามที่พบบ่อย
บทเรียน “การสืบทอดเดี่ยวและการสืบทอดหลายรูปแบบ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสืบทอดเดี่ยวและการสืบทอดหลายรูปแบบ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสืบทอดเดี่ยวและการสืบทอดหลายรูปแบบ”
จำลองความสัมพันธ์แบบ is-a ด้วยการสืบทอดเดี่ยว และจัดการข้อควรระวังของการสืบทอดหลายรูปแบบ คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การสืบทอดเดี่ยวและการสืบทอดหลายรูปแบบ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การสืบทอดเดี่ยวและการสืบทอดหลายรูปแบบ
- ฟังก์ชันเสมือนและ vtable
- คลาสนามธรรมและเมธอดเสมือนบริสุทธิ์
- ข้อแลกเปลี่ยนระหว่างการสืบทอดกับการประกอบ