【问题标题】:Alternative to dynamic polymorphisme C++动态多态 C++ 的替代方案
【发布时间】:2018-01-21 01:08:17
【问题描述】:


考虑以下多态情况:

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 会不会影响性能?
有没有其他选择?
最好的,
路易斯

【问题讨论】:

    标签: c++ dynamic polymorphism heterogeneous


    【解决方案1】:

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

    它会起作用,但我不会称之为好方法。问题是您的 vector 使用原始指针 (Shape*),它可能导致内存泄漏。更喜欢使用智能指针容器,即std::vector&lt;std::unique_ptr&lt;Shape&gt;&gt;,而不是原始容器std::vector&lt;Shape*&gt;

    vtable 的使用会影响性能吗?

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

    还有其他选择吗?

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

    替代方案的另一个问题是“没有一个能够在不牺牲间接间接性的情况下保持代码分离”(感谢 @SoroneHaetir )。

    【讨论】:

    • 而且没有一个替代方案能够在不牺牲间接性的情况下保持代码分离。
    • @SornelHaetir 这是一个很好的观点。将其添加到答案中
    猜你喜欢
    • 1970-01-01
    • 2017-06-28
    • 2022-11-01
    • 2023-03-24
    • 2011-02-12
    • 2011-01-31
    • 2012-03-14
    • 2014-02-24
    • 1970-01-01
    相关资源
    最近更新 更多