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

C++ 动态多态性的替代方案++;,c++,dynamic,polymorphism,heterogeneous,C++,Dynamic,Polymorphism,Heterogeneous,考虑以下多态现象: 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(


考虑以下多态现象:

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;
}
类形状{
公众:
形状();
虚空绘制()=0;
虚拟形状();
}
类三角形:公共形状{
公众:
三角形();
无效抽取();
~Triangle();
}
阶级广场:公共形态{
公众:
正方形();
无效抽取();
~Square();
}
班级圈子:公共形态{
公众:
圆圈();
无效抽取();
~Circle();
}
类容器{
公众:
void addShape(字符串类型);//创建并添加所选类型的实例以呈现列表
void render();//遍历每个对象的render_list和draw()
私人:
矢量渲染列表;
}
如果调度程序快速调用render()方法:这是实现异构集合的好方法吗?
vtable的使用会影响性能吗
有其他选择吗?
最佳,
路易

这是实现异构集合的好方法吗

这会管用的,但我不认为这是个好办法。问题在于,您的
向量
使用原始指针(
Shape*
),这可能导致内存泄漏。更喜欢使用智能指针的容器,即
std::vector
,而不是原始的
std::vector

vtable的使用是否会影响性能

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

还有别的选择吗

是的,有很多。从
enum
s,通过附加点和/或
union
s。他们比这个好吗?我不会这么说。每种方法都有各自的优缺点,但您的方法可能是最具可读性的方法,这在编写代码时是一个极其重要的因素


替代方案的另一个问题是“如果不牺牲同样的间接性,它们中没有一个能够保持代码分离”(感谢@SoronelHaetir).

而且,如果不牺牲同样的间接性,任何替代方案都无法保持代码分离。@SoronelHaetir这是一个很好的观点。我会在答案中加上这个