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

问题描述 投票:0回答:1

考虑以下多态性情况: 类形状{ 民众: 形状(); 虚拟无效绘制()= 0; 虚拟~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 的使用会带来性能问题吗?
有什么替代方案吗?

c++ dynamic polymorphism heterogeneous
1个回答
0
投票

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

它会起作用,但我不认为这是一个好方法。问题是您的

vector
使用原始指针 (
Shape*
),它可能会导致内存泄漏。更喜欢使用智能指针的容器,即
std::vector<std::unique_ptr<Shape>>
,而不是原始指针
std::vector<Shape*>

vtable的使用会对性能造成问题吗?

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

还有其他选择吗?

是的,有很多。从

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

替代方案的另一个问题是“如果不牺牲间接性,它们都无法保持代码分离”(感谢@SoronelHaetir)。

© www.soinside.com 2019 - 2024. All rights reserved.