2016-04-04 15 views
0

これはしばらくGoogleで検索されていましたが、明確な答えが見つからないようです。基本クラスへのポインタの配列:ユニークな派生クラスのメソッドを呼び出す方法

次の例で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

もし 'Derived'が必要な場合は、ポインタtそれは 'Derived *'の中で 'Base *'から 'Derived 'を回復できますが、あなたは*するべきではありません。あなたがそのようなことが必要な状況におかれたら、あなたのデザインに疑問を呈してください。 –

答えて

6

あなたが確信している場合、それは卵です:

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

あなたはそれが卵であるかどうかわからない場合:

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

あなたはdynamic_castでを使用することができます

auto e = dynamic_cast<Egg*>(ptr[1]); 
if(e) e->unscramble(); 
関連する問題