多态、向下转换和虚函数

Polymorphism, Downcasting, and Virtual Functions

本文关键字:函数 转换 多态      更新时间:2023-10-16

我有这段代码,用于将一个类更改为一个更面向对象的c++类,即:在主循环中调用更少。

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是一个纯抽象类,由另一个类继承,即:Circle。

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

当Circle被下cast为Shape时,会调用其虚函数的重载还是调用抽象函数?

程序将使用运行时信息(所谓的"虚表")来确定调用哪个虚函数。这将在完全不考虑向下/向上转换的情况下完成,换句话说-将调用正确的重载函数。

作为旁注——如果你真的想调用虚函数的特定"化身",那么你必须使用显式的名称解析,像这样:

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