คลาสนามธรรมและเมธอดเสมือนบริสุทธิ์
กำหนดส่วนเชื่อมต่อด้วยเมธอดเสมือนบริสุทธิ์ และบังคับใช้ข้อกำหนดกับคลาสสืบทอด
คลาสนามธรรมและเมธอดเสมือนบริสุทธิ์ เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คลาสนามธรรมคืออะไร
คลาสนามธรรม มีฟังก์ชันอย่างน้อยหนึ่งฟังก์ชันที่เป็น เสมือนล้วน ซึ่งประกาศด้วย = 0 คุณไม่สามารถสร้างอินสแตนซ์ของคลาสนี้โดยตรงได้
class Animal {
public:
virtual void speak() const = 0; // pure virtual
virtual ~Animal() = default;
};
// Animal a; // ERROR: cannot instantiateฟังก์ชันเสมือนล้วน
= 0 ระบุว่าฟังก์ชันไม่มีการทำงานเริ่มต้น คลาส derived ต้องเขียนทับฟังก์ชันนั้นก่อนจึงจะสร้างอินสแตนซ์ของคลาสได้
การใช้งานอินเทอร์เฟซ
คลาส derived ต้องจัดเตรียมส่วนการทำงานที่เป็นรูปธรรมให้กับฟังก์ชันเสมือนล้วนทุกฟังก์ชัน
class Dog : public Animal {
public:
void speak() const override {
std::cout << "Woof!\n";
}
};
Dog d;
d.speak(); // Woof!คลาสนามธรรมในฐานะอินเทอร์เฟซ
คลาสนามธรรมที่มีเฉพาะเมธอดเสมือนล้วนและไม่มีสมาชิกข้อมูล จะทำหน้าที่เหมือนอินเทอร์เฟซในภาษาอื่น
class Drawable {
public:
virtual void draw() const = 0;
virtual ~Drawable() = default;
};การรวมการทำงานกับอินเทอร์เฟซ
คลาสนามธรรมสามารถมีทั้งเมธอดเสมือนล้วนและเมธอดที่มีการทำงานจริงได้ เมธอดเสมือนล้วนกำหนดสัญญา ส่วนเมธอดที่มีการทำงานจริงจะมอบพฤติกรรมร่วมกัน
class Logger {
public:
void logInfo(const std::string& msg) { log("INFO", msg); }
void logError(const std::string& msg) { log("ERROR", msg); }
protected:
virtual void log(const std::string& level, const std::string& msg) = 0;
};ฟังก์ชันเสมือนล้วนที่มีส่วนการทำงานเริ่มต้น
ฟังก์ชันเสมือนล้วนสามารถมีส่วนการทำงานได้ ซึ่งมีประโยชน์ในฐานะค่าเริ่มต้นที่คลาส derived สามารถเรียกใช้
class Base {
public:
virtual void f() = 0;
};
void Base::f() {
std::cout << "default behavior\n";
}
class Derived : public Base {
public:
void f() override {
Base::f(); // call the default
std::cout << "extra\n";
}
};การใช้งานผ่านตัวชี้และการอ้างอิง
โค้ดที่รองรับพหุสัณฐานจะถือวัตถุแบบนามธรรมผ่านตัวชี้หรือการอ้างอิงไปยังชนิด base
void perform(const Animal& a) {
a.speak();
}การจัดเก็บในคอนเทนเนอร์
เวกเตอร์ไม่สามารถเก็บชนิดนามธรรมแบบส่งค่าได้ ให้ใช้ตัวชี้ ซึ่งโดยทั่วไปคือตัวชี้อัจฉริยะ
std::vector<std::unique_ptr<Animal>> zoo;
zoo.push_back(std::make_unique<Dog>());
zoo.push_back(std::make_unique<Cat>());
for (auto& a : zoo) a->speak();ควรใช้คลาสนามธรรมเมื่อใด
ใช้คลาสเหล่านี้เมื่อ:
- ต้องการกำหนดอินเทอร์เฟซร่วมสำหรับการใช้งานหลายรูปแบบที่ไม่เกี่ยวข้องกัน
- ต้องการชนิด base สำหรับคอนเทนเนอร์ที่รองรับพหุสัณฐาน
- ต้องการแทรกพฤติกรรมผ่านคลาสย่อย (รูปแบบเมธอดแม่แบบ)
ทางเลือกอื่น: แนวคิดและแม่แบบ
สำหรับพหุสัณฐานขณะคอมไพล์ แนวคิดและแม่แบบของ C++20 มักใช้แทนคลาสนามธรรมได้ โดยไม่มีต้นทุนขณะทำงาน ให้ใช้ฟังก์ชันเสมือนเมื่อจำเป็นต้องใช้พหุสัณฐานขณะทำงาน
ข้อควรระวัง: การตัดส่วน
ส่งคลาสนามธรรมผ่านการอ้างอิงหรือตัวชี้ การส่งแบบค่าทำไม่ได้อยู่แล้ว เพราะไม่สามารถสร้างอินสแตนซ์ของชนิดนามธรรมได้ แต่การส่งคลาส derived แบบค่าจะทำให้เกิดการตัดส่วน
ตรวจสอบความเข้าใจ
อะไรทำให้คลาสเป็นคลาสนามธรรมใน C++
สรุปทบทวน
คลาสนามธรรม ซึ่งมีเมธอดเสมือนล้วอย่างน้อยหนึ่งเมธอด ใช้กำหนดอินเทอร์เฟซสำหรับโค้ดที่รองรับพหุสัณฐาน ให้ใช้งานผ่านตัวชี้หรือการอ้างอิง ซึ่งมักเป็นตัวชี้อัจฉริยะ เพื่อเลือกพฤติกรรมขณะทำงาน
คำถามที่พบบ่อย
บทเรียน “คลาสนามธรรมและเมธอดเสมือนบริสุทธิ์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “คลาสนามธรรมและเมธอดเสมือนบริสุทธิ์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “คลาสนามธรรมและเมธอดเสมือนบริสุทธิ์”
กำหนดส่วนเชื่อมต่อด้วยเมธอดเสมือนบริสุทธิ์ และบังคับใช้ข้อกำหนดกับคลาสสืบทอด คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “คลาสนามธรรมและเมธอดเสมือนบริสุทธิ์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การสืบทอดเดี่ยวและการสืบทอดหลายรูปแบบ
- ฟังก์ชันเสมือนและ vtable
- คลาสนามธรรมและเมธอดเสมือนบริสุทธิ์
- ข้อแลกเปลี่ยนระหว่างการสืบทอดกับการประกอบ