لماذا نحتاج إلى الدوال الافتراضية في 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"، بينما