Ответ на редактирование проблемы:
Лучшее решение - найти виртуальный метод, который доставит то, что требуется.Для обнаружения столкновений фигур, возможно, у вас может быть функция, которая преобразует каждую фигуру в многоугольник (набор линий) и выполняет обнаружение по ней.
C ++ использует тип, который вы объявили во время компиляции, чтобы выбрать, какой перегруженныйфункция для вызова;у него нет возможности сделать этот выбор во время выполнения.Вот почему вы видите «Shape, Shape» как вывод каждый раз.Есть способ выручить компилятор, но он будет утомительным.Попытайтесь преобразовать каждый Shape * в соответствующий тип, и если это удастся, вы можете вызвать более конкретную функцию.
Я не особо поддерживаю это;Вы можете видеть, как это выходит из-под контроля всего с двумя формами, представьте, как это уродливо, когда вы добавляете больше!Тем не менее он показывает, как сделать то, что вы пытались сделать в C ++.
void print_types (Rectangle*, Rectangle*) {
std::cout << "Rectangle, Rectangle" << std::endl;
}
void print_types (Rectangle*, Circle*) {
...
void print_types (Rectangle* left, Shape* right) {
Rectangle* rightRect = dynamic_cast<Rectangle*>(right);
if (rightRect != NULL) {
print_types(left, rightRect);
return;
}
Circle* rightCirc = dynamic_cast<Circle*>(right);
if (rightCirc != NULL) {
print_types(left, rightCirc);
return;
}
throw /* something to indicate invalid shape */;
}
void print_types (Circle* left, Shape* right) {
...
void print_types (Shape* left, Shape* right) {
Rectangle* leftRect = dynamic_cast<Rectangle*>(left);
if (leftRect != NULL) {
print_types(leftRect, right);
return;
}
Circle* leftCirc = dynamic_cast<Circle*>(left);
if (leftCirc != NULL) {
print_types(leftCirc, right);
return;
}
throw /* something to indicate invalid shape */;
}