Альтернатива динамическому полиморфизму C++


Рассмотрим следующий случай полиморфизма:

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 проблемой для производительности?
Есть ли альтернатива?
Лучший,
Луис

1 ответ

Решение

Это хороший способ реализации гетерогенной коллекции?

Это будет работать, но я бы не назвал это хорошим способом. Проблема в том, что ваш vector использует сырые указатели (Shape*) и это может привести к утечке памяти. Предпочитаю использовать контейнеры с умными указателями, т.е. std::vector<std::unique_ptr<Shape>>вместо сырых std::vector<Shape*>,

Будет ли использование vtable проблемой для производительности?

Хит производительности будет незначительным. Это очень правильное использование полиморфизма.

Есть ли альтернатива?

Да, их много. От enumс помощью дополнительных точек и / или unions. Они лучше чем этот? Я бы так не сказал. У каждого есть свои плюсы и минусы, но ваш подход, вероятно, самый читаемый, что является чрезвычайно важным фактором при написании кода.

Дополнительной проблемой для альтернатив является тот факт, что "ни один из них не сможет сохранить разделение кода без тех же жертв косвенного воздействия" (спасибо @SoronelHaetir).

Другие вопросы по тегам