Наследование c ++ Child Parent - PullRequest
       24

Наследование c ++ Child Parent

2 голосов
/ 14 февраля 2012

У меня есть простая проблема:

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); 

Не работает: неопределенная ссылка на `Weapon :: Shot (float) '

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

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 14 февраля 2012
Weapon wep;
wep = Uzi;

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

Weapon* wep = new Uzi();

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

Возможно, вы захотите объявить его 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 голосов
/ 14 февраля 2012

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

virtual void Shot(float angle) = 0;

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

Редактировать: Да, и вы можете 'Чтобы просто присваивать конструкторы друг другу, вам нужно создать конкретный подкласс, то есть:

Weapon *weapon = new Uzi();

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

0 голосов
/ 14 февраля 2012

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

...