с++ ShapesDetector
В этой задаче вам предстоит определять динамический тип объектов
А именно, есть иерархия классов
class Shape {
public:
virtual double area() = 0;
};
class Ellipse : public Shape { // Овал
public:
double area() override;
};
class Circle : public Ellipse { // Круг
public:
double area() override;
};
class Rectangle : public Shape { // Прямоугольник
public:
double area() override;
};
class Square : public Rectangle { // Квадрат
public:
double area() override;
};
Ваша задача написать функции
bool IsCircle(const Shape& shape);
bool IsEllipse(const Shape& shape);
bool IsSquare(const Shape& shape);
bool IsRectangle(const Shape& shape);
1. IsCircle возвращает true, если лежайщий под shape объект является Circle. false --
иначе
2. IsEllipse возвращает true, если лежайщий под shape объект является Ellipse. false --
иначе
3. IsSquare возвращает true, если лежайщий под shape объект является Square. false --
иначе
4. IsRectangle возвращает true, если лежайщий под shape объект является Rectangle. false
-- иначе
А именно, вызов IsRectangle(Square()) должен вернуть false, и только вызов
IsRectangle(Rectangle()) вернет true.
В систему отправляйте лишь код функций и необходимые библиотеки, всё остальное будет
подключено автоматически
Указание: подумайте, как можно применить dynamic_cast
Answers & Comments
bool IsCircle(const Shape& shape) {
const Circle* circle = dynamic_cast<const Circle*>(&shape);
return circle != nullptr;
}
bool IsEllipse(const Shape& shape) {
const Ellipse* ellipse = dynamic_cast<const Ellipse*>(&shape);
return ellipse != nullptr;
}
bool IsSquare(const Shape& shape) {
const Square* square = dynamic_cast<const Square*>(&shape);
return square != nullptr;
}
bool IsRectangle(const Shape& shape) {
const Rectangle* rectangle = dynamic_cast<const Rectangle*>(&shape);
return rectangle != nullptr;
}
В каждой функции мы используем оператор dynamic_cast, чтобы проверить, является ли указатель на объект типа Shape также указателем на объект нужного подтипа. Если да, то dynamic_cast вернет указатель на объект нужного подтипа, в противном случае - nullptr. Затем мы возвращаем логическое значение true, если указатель не является нулевым, и false в противном случае.