Avatar ·

لماذا نحتاج إلى الدوال الافتراضية في C++؟ اشرح بمثال

مرحبًا! لقد بدأت للتو في تعلم C++ وأحاول فهم الدوال الافتراضية. قرأت الكثير من المقالات، لكني ما زلت لا أفهم تمامًا لماذا نحتاج إليها. لدي كلاس أساسي `Animal` وكلاسات مشتقة `Dog` و `Cat`. أريد أن يكون لكل حيوان صوته الخاص. بدون دوال افتراضية، كتبت هكذا: ```cpp class Animal { public: void speak() { cout << "Some animal sound\n"; } }; class Dog : public Animal { public: void speak() { cout << "Woof!\n"; } }; class Cat : public Animal { public: void speak() { cout << "Meow!\n"; } }; ``` عندما أنشئ الكائنات مباشرة، كل شيء يعمل: ```cpp Dog dog; Cat cat; dog.speak(); // Woof! cat.speak(); // Meow! ``` لكن إذا استخدمت مؤشرًا للكلاس الأساسي، يتم استدعاء دالة الكلاس الأساسي بدلاً من الكلاس المشتق: ```cpp Animal* ptr1 = new Dog(); Animal* ptr2 = new Cat(); ptr1->speak(); // يطبع "Some animal sound"، بينما يجب أن يطبع "Woof!" ptr2->speak(); // يطبع "Some animal sound"، بينما