动态多态 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 ?
是的,有很多。从 enum
s 开始,通过额外的点 and/or union
s。他们比这个好吗?我不会这么说。每种方法都有其优缺点,但您的方法可能是最易读的方法,这是编写代码时极其重要的因素。
备选方案的另一个问题是“none 能够保持代码分离,而无需对间接性做出同样的牺牲”(感谢@SoronelHaetir).
考虑以下多态情况:
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 ?
是的,有很多。从 enum
s 开始,通过额外的点 and/or union
s。他们比这个好吗?我不会这么说。每种方法都有其优缺点,但您的方法可能是最易读的方法,这是编写代码时极其重要的因素。
备选方案的另一个问题是“none 能够保持代码分离,而无需对间接性做出同样的牺牲”(感谢@SoronelHaetir).