Рассмотрим следующий случай полиморфизма:
class Shape {
public:
Shape();
virtual void draw() = 0;
virtual ~Shape();
}
class Triangle : public Shape {
public:
Triangle();
void draw();
~Triangle();
}
class Square : public Shape {
public:
Square();
void draw();
~Square();
}
class Circle : public Shape {
public:
Circle();
void draw();
~Circle();
}
class Container {
public:
void addShape(string type); //Create and add instance of selected type to render_list
void render(); //iterate through render_list and draw() each object
private:
vector<Shape*> render_list;
}
Если метод render () вызывается планировщиком с высокой скоростью: это хороший способ реализации гетерогенной коллекции?
Будет ли использование vtable проблемой для производительности?
Есть ли альтернатива?
Лучший,
Луис
Это хороший способ реализации гетерогенной коллекции?
Это будет работать, но я бы не назвал это хорошим способом. Проблема в том, что ваш vector
использует сырые указатели (Shape*
) и это может привести к утечке памяти. Предпочитаю использовать контейнеры умных указателей, т.е. std::vector<std::unique_ptr<Shape>>
вместо сырых std::vector<Shape*>
,
Будет ли использование vtable проблемой для производительности?
Хит производительности будет незначительным. Это очень правильное использование полиморфизма.
Есть ли альтернатива?
Да, их много. От enum
с помощью дополнительных точек и / или union
s. Они лучше чем этот? Я бы так не сказал. У каждого есть свои плюсы и минусы, но ваш подход, вероятно, самый читаемый, что является чрезвычайно важным фактором при написании кода.
Дополнительной проблемой для альтернатив является тот факт, что «ни один из них не сможет сохранить разделение кода без тех же жертв косвенному» (Спасибо @SoronelHaetir).
Других решений пока нет …