2012-02-14 3 views
2

У меня есть простая задача:Наследование C++ Ребенок Родитель

class Weapon{ 
public: 
    int dmg; 
    float speed; 
    int rate; 
}; 

class Uzi : public Weapon{ 
public: 
    Uzi(); 
    void Shot(float angle); 
}; 

Class Pistol : public Weapon{ 
public: 
    Pistol(); 
    void Shot(float angle); 
}; 

Позже в коде, когда я оставляю за собой, например:

Weapon wep; 
wep = Uzi; 
wep.Shot(15); 

Это не работает: неопределенная ссылка на `оружие :: Выстрел (float) '

Могу ли я зарезервировать переменную типа «wep»? Я думаю, нет, потому что оружие меняется (пистолет/узи/...).

Заранее благодарен!

+0

Вы добавили реализацию класса в файл cpp? –

+0

У вас есть, по сути, определение 'Uzi :: Shot'? И вы действительно пытаетесь называть 'Shot()' без параметра? –

+0

@ Карл Я реализовал их. – ewooycom

ответ

0
Weapon wep; 
wep = Uzi; 

Это нарезка. Uzi есть-Weapon, но не наоборот. Вы можете использовать указатели для этого:

Weapon* wep = new Uzi(); 

Кроме того, вы получите сообщение об ошибке, потому что нет Shot() метода в Weapon() классе.

Возможно, вы захотите его объявить virtual, а также сделать его абстрактным (по желанию). Вы делаете это virtual, чтобы разрешить полиморфизм.

Таким образом:

Weapon* wep = new Uzi(); 
wep->Shot(); 

будет вызывать Shot() в Uzi классе, хотя это называется на Weapon указателем.

должно работать:

class Weapon{ 
public: 
    int dmg; 
    float speed; 
    int rate; 
    virtual void Shot(float angle) {}; //move implementation to cpp file 
}; 
+0

Спасибо, его отличный :) – ewooycom

+0

@ user1188570 рад помочь. –

0

Вы забыли объявить void Shot(float angle) в классе Weapon.

+0

Я сделал, но все еще получаю неопределенную ссылку на «Weapon :: Shot (float)» – ewooycom

0

Для полиморфизма, вам нужно виртуализировать метод, оружие следует объявить:

virtual void Shot(float angle) = 0; 

, а затем каждый подкласс должен реализовать виртуальный метод.

Edit: Да, и вы не можете просто назначить конструкторами друг с другом, необходимо создать экземпляр конкретного подкласса, то есть:

Weapon *weapon = new Uzi(); 

как уже упоминалось в ряде других ответов.

Смежные вопросы