0Pricing
C++ Academy · บทเรียน

การสืบทอดเดี่ยวและการสืบทอดหลายรูปแบบ

จำลองความสัมพันธ์แบบ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การสืบทอดเดี่ยวและการสืบทอดหลายรูปแบบ
  2. ฟังก์ชันเสมือนและ vtable
  3. คลาสนามธรรมและเมธอดเสมือนบริสุทธิ์
  4. ข้อแลกเปลี่ยนระหว่างการสืบทอดกับการประกอบ
← กลับไปที่ C++ Academy