В этом коде есть несколько вещей, которые можно улучшить.Однако важно, чтобы вы понимали концепции наследования, полиморфизма и грубые детали, лежащие в основе реализации полиморфизма в C ++.
Например: деструктор базового класса по умолчанию не является автоматически виртуальным.Вам необходимо указать деструктор виртуального базового класса, когда вы собираетесь реализовать полиморфную структуру.Производные классы автоматически устанавливаются на виртуальные, если (если и только если) базовый класс имеет виртуальный деструктор.
Чтобы отсортировать список фигур, сначала необходимо создать список Shape*
.Затем вам нужно написать функцию сравнения, которая будет принимать 2 фигуры и использовать один из их членов для сравнения.В вашем примере нечего было использовать.Обе функции-члены были void
, а переменные-члены были приватными.
См. Код ниже, и, надеюсь, это будет иметь смысл.
#include <iostream>
#include <cmath>
#include <list>
struct Shape
{
Shape() = default;
virtual float surface() const = 0;
virtual void circuit() = 0;
virtual ~Shape() noexcept = default;
};
class Circle final : public Shape
{
private:
float r;
public:
Circle(float r_) : r(r_)
{;}
float surface() const override
{
return M_PI*pow(r,2);
}
void circuit() override
{
std::cout<<"Circle circuit: " << 2.f*M_PI*r <<std::endl;
}
~Circle() noexcept = default;
};
class Square final : public Shape
{
private:
float a;
public:
Square(float a_) : a(a_)
{;}
float surface() const override
{
return pow(a,2);
}
void circuit() override
{
std::cout<<"Square circuit: " << 4.f*a <<std::endl;
}
~Square() noexcept = default;
};
bool compare_shape(const Shape *const s1, const Shape *const s2)
{
return (s1->surface() < s2->surface());
}
int main()
{
// no polymorphism
Circle c(8);
std::cout<< "Circle surface: " << c.surface() <<std::endl;
c.circuit();
Square s(2);
std::cout<< "Square surface: " << s.surface() <<std::endl;
s.circuit();
std::cout<< "____________________" <<std::endl<<std::endl;
// polymorphism
Shape *c_ptr = new Circle(8);
std::cout<< "Circle surface: " << c_ptr->surface() <<std::endl;
c_ptr->circuit();
delete c_ptr;
Shape *s_ptr = new Square(2);
std::cout<< "Square surface: " << s_ptr->surface() <<std::endl;
s_ptr->circuit();
delete s_ptr;
std::cout<< "____________________" <<std::endl<<std::endl;
// list of Shapes
std::list<Shape*> shapes;
shapes.push_back( new Circle(8) );
shapes.push_back( new Square(2) );
for (auto &&i : shapes)
{
std::cout<< "Shapes' surface: " << i->surface() <<std::endl;
i->circuit();
}
std::cout<< "\n-- sorting the list based on the shapes' surface.\n" <<std::endl;
shapes.sort(compare_shape);
for (auto &&i : shapes)
{
std::cout<< "Shapes' surface: " << i->surface() <<std::endl;
i->circuit();
}
};
Пример кода в сети: https://rextester.com/EBKIH52610