@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
Вижу два варианта: либо я дурак, либо я дурак - выбрать не могу, помогите.
  • Вопрос задан
  • 95 просмотров
Решения вопроса 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, что исключает полиморфизм.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы