@Sinus_314

Как вызвать переопределенную функцию у дочернего объекта, находяшегося в родительском массиве?

Есть класс Moved:
class Moved{
	public:
		virtual int getType();
		virtual int getBS() ;
};

Есть два дочерних класса:
class Car : public Moved{
	public:
		int getBS() override;
		int getType() override;
};
class Walker : public Moved{
	public:
		int getBS() override;
		int getType() override;
};


Они инициализированы:
int Moved::getBS() {
	return -1;
}
int Moved::getType() {
	return -1;
}

int Car::getBS() {
	return 3;
}

int Walker::getBS() {
	return 1;
}
int Car::getType() {
	return 0;
}
int Walker::getType() {
	return 1;
}


Но при использовании вызывается родительская функция:
void Printer::addM(Moved obj) {
	Moved* tmp = new Moved[mSize];
	for (int i = 0; i < mSize; i++) tmp[i] = objs[i];
	objs = new Moved[++mSize];
	for (int i = 0; i < mSize - 1; i++)
		objs[i] = tmp[i];
	
	objs[mSize - 1] = obj;
	Car mytmp; // для теста
	cout << mytmp.getType() << endl; // для теста
	cout << objs[mSize-1].getType() << endl; 
	Sleep(100);
}


Car M;
	Car M1;
	Car M2;
	Car M3;
	Car M4;
	Walker W;
	Walker W1;
	Walker W2;
	P.addM(M);
	P.addM(M1);
	P.addM(M2);
	P.addM(W);
	P.addM(W1);
	P.addM(W2);

5efaea298eff7353217206.png
Вижу два варианта: либо я дурак, либо я дурак - выбрать не могу, помогите.
  • Вопрос задан
  • 101 просмотр
Решения вопроса 1
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Переформатировал код под себя. Не могу воспринимать египетские скобки.

void Printer::addM(Moved obj) 
{
  Moved* tmp = new Moved[mSize];
  for (int i = 0; i < mSize; i++) 
  {
      tmp[i] = objs[i];
  }
  objs = new Moved[++mSize];
  for (int i = 0; i < mSize - 1; i++)
  {
    objs[i] = tmp[i];
  }
  objs[mSize - 1] = obj; 
  Car mytmp; // для теста
  cout << mytmp.getType() << endl; // для теста
  cout << objs[mSize-1].getType() << endl; 
  Sleep(100);
}


У вас две проблемы. Во-первых вы зачем-то переизобрели std::vector, поэтому вам приходится писать примерно в 5 раз больше кода чем надо.

Во-вторых, вам надо хранить не объекты Moved, а указатели на них, и тогда ваша гомологическая иерархия классов заработает.

Как я и говорил выше, addM работает не так, как вы ожидаете. Когда вы ее вызываете, у вас происходит создание Moved на основе Car или Walker, что исключает полиморфизм.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы