אתה מפספס משהו, neko
בשפת ++C פונקציה יכולה להיות virtual, או pure virtual. כשפונקציה היא virtual, זה אומר שבבנים שלה יהיה מימוש default של האבא, או מימוש מיוחד של הבן. לדוגמה:
class CBase { public: virtual void myFunc() { cout << "Hello, CBase!" << endl; } }; class CChild1 : public CBase { public: virtual void myFunc() { cout << "Hello, CChild1!" << endl; } }; class CChild2 : public CBase { }; int main() { CChild1 ch1; CChild2 ch2; ch1.myFunc(); // Will output "Hello, CChild1!" ch2.myFunc(); // Will output "Hello, CBase" return (0); }
בפונקציה שהיא pure virtual, לעומת זאת, האבא לא מגדיר מימוש default לפונקציה אלא מגדיר אותה בכוונה בתור פונקציה לא ממומשת, כדי
לכפות על היורשים שלו ליישם אותה. זו שיטה טובה להכתיב מימוש ליורשים. ככה מגדיר Pure virtual:
class CBase { public: virtual void mustBeImplementedInDerived() = 0; }; class CChild1 : public CBase { public: virtual void mustBeImplementedInDerived() { cout << "This is my implementation" << endl; } }; class CChild2 : public CBase { }; int main() { CChild1 ch1; // OK! CChild2 ch2; // NOT OK - CChild2 is abstract return (0); }
הקוד הזה לא יתקמפל כי אי אפשר ליצור instance של CChild2, כי הוא אבסטרקטי (כיוון שלא מימש את הפונקציה הוירטואלית הטהורה).