从超类指针向量调用重写的方法

Henrik Hillestad Løvold

我目前正在使用 C++ 在 OpenGL 中编写一个小游戏。来自非 C++ 背景,我有一个关于重写方法以及如何使用超类类型的指针调用它们的简单问题。

情况就是这样:我有一个Polygon包含 method的类void draw()这个类有两个名为Rectangleand的子类Circle,它们都覆盖了绘图方法,因为我使用不同的 OpenGL 调用,具体取决于所绘制多边形的类型。

现在考虑一下:我希望将所有多边形(包括矩形和圆形)存储在std::vector<Polygon*>. 这很好。但是,遍历向量并draw自动调用该方法的超类版本。

如何创建超类指针类型的向量,在其中存储指向子类对象的指针,并根据正在使用的对象的实际类型调用覆盖函数?

稻田

您正在描述多态性(或在您当前的实现中缺少多态性)。

要使您的draw函数具有多态性,您必须声明它virtual请参阅下面的示例:

class Polygon {
public:
    virtual ~Polygon() {}
    virtual void draw() = 0;
};

class Rectangle : public Polygon
{
public:
    void draw() override { std::cout << "Rectangle::draw()\n"; }
};

class Circle : public Polygon
{
public:
    void draw() override { std::cout << "Circle::draw()\n"; }
};

注意上面的三个额外的东西:

  1. 我还将析构函数声明为虚拟的。这允许通过其基类指针正确销毁对象。
  2. 我将基本draw方法声明为纯虚拟(= 0部分)。这意味着Polygon该类是抽象的,并且本身不能被实例化。您可能不希望这样,但对我来说,无论如何,基类上的 draw 方法似乎没有用。如果需要,定义一个。由你决定。
  3. override说明符是可选的,但建议使用(C++11 引入的语言特性)。它指示编译器您有意覆盖虚拟方法,因此如果不存在要覆盖的此类方法,则会生成编译器错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章