Массив указателей на базовый класс: как вызвать метод уникального производного класса

Некоторое время гуглил, но, похоже, не могу найти четкого ответа.

Как вызвать метод unscramble () в следующем примере?

Благодарю. : ^)

class Food {
public:
Food(string _t):type(_t);
virtual void eat() = 0;
private:
string type;
}

class Fruit : public Food {
public:
Fruit(string _t):Food(_t) {
virtual void eat() { // Yummy.. }
}

class Egg : public Food {
public:
Egg(string _t):Food(_t)};
virtual void eat() { // Delicious! };
void unscramble();
}

int main() {
Food *ptr[2];
ptr[0] = new Fruit("Apple");
ptr[1] = new Egg("Brown");

// Now, I want to call the unscramble() method on Egg.
// Note that this method is unique to the Egg class.
ptr[1]->unscramble();
// ERROR: No member "unscramble" in Food

cout << "\n\n";
return 0;
}

0

Решение

Если вы уверены, что это яйцо:

static_cast<Egg*>(ptr[1])->unscramble();

Если вы не знаете, яйцо ли это:

auto egg = dynamic_cast<Egg*>(ptr[1]);
if (egg != nullptr)
egg->unscramble();
6

Другие решения

Вы могли бы использовать dynamic_cast следующим образом:

auto e = dynamic_cast<Egg*>(ptr[1]);
if(e) e->unscramble();
1