动态多态 C++ 的替代方案

Alternative to dynamic polymorphisme 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 的使用是否会影响性能?
还有其他选择吗?
最好的,
路易斯

is this a good way of implementing an heterogenous collection ?

它会起作用,但我认为这不是一个好方法。问题是您的 vector 使用原始指针 (Shape*),这可能会导致内存泄漏。更喜欢使用智能指针的容器,即 std::vector<std::unique_ptr<Shape>>,而不是原始的 std::vector<Shape*>.

Will the vtable use be a problem for performance ?

对性能的影响可以忽略不计。这就是多态性的正确用法。

Is there any alternative ?

是的,有很多。从 enums 开始,通过额外的点 and/or unions。他们比这个好吗?我不会这么说。每种方法都有其优缺点,但您的方法可能是最易读的方法,这是编写代码时极其重要的因素。

备选方案的另一个问题是“none 能够保持代码分离,而无需对间接性做出同样的牺牲”(感谢@SoronelHaetir).