c++ - 多态、向下转型和虚函数

标签 c++ polymorphism

我有这段代码可以将类更改为更面向对象的 C++ 类,IE:主循环内的调用更少。

class Shape abstract 
{
public:
    virtual bool Check_Collision(SDL_Point);
    virtual bool Check_Collision(SDL_Rect);
    virtual bool Check_Collision(Shape&);
protected:
};

class Adv_Object : public Object
{
public:
    Adv_Object(Shape *obj);
    virtual void Set_Shape(Shape* obj) { prec_area = obj; }
    virtual bool Check_Collision(SDL_Point);
    virtual bool Check_Collision(SDL_Rect);
    virtual bool Check_Collision(Shape&);
protected:
    Shape* prec_area; //Better Area Determination
};

其中Shape是一个纯抽象类,被另一个类IE:Circle继承。

class Circle : public Shape
{
  public:
   void Check_Collision(SDL_Point) override;
   void Check_Collision(SDL_Rect) override;
   void Check_Collision(Shape&) override;
};

当 Circle 向下转型为 Shape 时,是调用它的虚函数重载还是调用抽象函数?

最佳答案

程序将使用运行时信息(所谓的“虚拟表”)来确定调用哪个虚拟函数。这将完全无视您的向下/向上转换,换句话说 - 将调用正确的重载函数。

作为旁注 - 如果您真的想调用虚函数的特定“化身”,那么您必须使用显式名称解析,如下所示:

Shape * c = new Circle;
c->Square::Check_Collision(...); // I hope you see the issues this maycause

关于c++ - 多态、向下转型和虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24462349/

相关文章:

c++ - 方法重写(没有虚拟方法或指针)是否被视为多态性的一部分?

c++ - 在 VS2010 中使用 Boost.Pool - 链接器错误

c++ - 尝试在屏幕上显示绘图时出现黑屏

C++ 双重初始化

c# - 从抽象父类调用泛型列表上的方法

iphone - 我想使用多态性对我的难闻代码进行重构。这是一个删除 'if' 语句的问题

perl - 如何让 Moose 返回一个子类实例而不是它自己的类,以实现多态性

c++ - 使用 tcmalloc - 如何正确加载 malloc 扩展?

内存分配时的 C++ 错误

c++ - 纯虚函数和继承