2016-04-04 11 views
0

Googeln für eine Weile auf diesem, aber kann nicht scheinen, eine klare Antwort zu finden.Array von Zeigern auf Basisklasse: wie Unique abgeleitete Klasse Methode aufrufen

Wie rufe ich die Methode unscramble() im folgenden Beispiel auf?

Danke. : ^)

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

Wenn Sie eine 'Derived' wollen, behalten Sie einen Zeiger t o es in einem 'Abgeleiteten *' Sie * kann * 'Abgeleitet' von einem 'Base *' wiederherstellen, aber Sie * sollten nicht *. Wenn Sie sich in einer Situation befinden, in der Sie so etwas brauchen, hinterfragen Sie Ihr Design. –

Antwort

6

Wenn Sie sicher sind, ist es ein Ei:

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

Wenn Sie nicht wissen, ob es sich um ein Ei ist:

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

könnten Sie verwenden dynamic_cast in die folgende Art und Weise:

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