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这是一个很好的观点。我会在答案中加上这个