Другие языки программирования и технологии

C++ Классы и Переменные

Собственно пишу игру. Планируется много типов юнитов. Которые отличаться будут некоторыми свойствами и функциями. Я так понимаю надо создать базовый класс Unit от которого наследовать Unit1 Unit2 и тд. и переопределять то что необходимо. Но в таком случае как динамически сделать переменную x нужного класса? Пример: if (a
class Unit
{
public:
Unit ();
virtual ~Unit ();
virtual void Method() { printf("Unit::Method()\n"); }
};

class Unit1 : public Unit
{
public:
Unit1();
virtual ~Unit1();
virtual void Method() { printf("Unit1::Method()\n"); }
};

class Unit2 : public Unit
{
public:
Unit2();
virtual ~Unit2();
virtual void Method() { printf("Unit2::Method()\n"); }
};

int main()
{
Unit *pUnit = NULL;
if (a < b)
{
pUnit = new Unit1;
}
else
{
pUnit = new Unit2;
}
pUnit->Method();
delete pUnit;

return 0;
}

Поскольку указатели на производные классы приводятся к указателям на базовый класс, то Method() дожен быть объявлен как виртуальный, как в базовом классе, так и в производных классах. В этом случае будут работать методы призводных классов. В противном случае везде будет работать метод базового класса. Можешь проверить: в методах напиши какое нибудь сообщение, метод какого класса вызвался.

if ( a < b )
{
Unit1 x;
}
else
{
Unit2 x;
}
x сущестует только внутри if( ){ x - только здесь } здесь уже нет
Сергей Голубев
Сергей Голубев
21 360
Лучший ответ
Помоему так делать просто нельзя. А что компилятор то говорит??
Виктор Шантин
Виктор Шантин
7 875
// скобки забыл

if ( a < b ) {
Unit1 x;
}else{
Unit2 x;
}
Aliy Shaiyrbek
Aliy Shaiyrbek
2 033
Если наследуешься то по идеи:
Unit* x;
if (a < b)
x = new Unit1();
else
x = new Unit2();
Вообще по идеи Unit должен быть интерфейсом, а Unit1 и Unit2 реализацией. С++ давно не занимался, мог ошибиться с кодом.
На сколько я помню не правильно обьявляешь экземпляры класса.
Нужно так:
Unit *x;
if ( a < b )
{
x = new Unit1(<сюда параметры для конструктора>);
}else{
x = new Unit2(<сюда параметры для конструктора>);
}