Полиморфизм, понижение и виртуальные функции

#c #polymorphism

#c #полиморфизм

Вопрос:

У меня есть этот код для изменения класса на более объектно-ориентированный класс C , то есть: меньше вызовов внутри основного цикла.

 class Shape abstract 
{
public:
    virtual bool Check_Collision(SDL_Point);
    virtual bool Check_Collision(SDL_Rect);
    virtual bool Check_Collision(Shapeamp;);
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(Shapeamp;);
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(Shapeamp;) override;
};
 

Когда Circle преобразуется в форму, будут ли вызываться его перегрузки виртуальных функций или вместо этого будут вызываться абстрактные функции?

Комментарии:

1. Обратите внимание, что class Shape abstract это не C .

2. У вас есть понижение в обратном направлении: круг преобразуется в форму.

3. @milleniumbug Это расширение C / CLI — OP, похоже, не знает об этом zzz

4. В полиморфизме не было бы никакого смысла, если бы виртуальные функции базового класса вызывались в экземпляре производного класса.

Ответ №1:

Программа будет использовать информацию о времени выполнения (так называемую «виртуальную таблицу»), чтобы определить, какую виртуальную функцию вызывать. Другими словами, это будет сделано с полным игнорированием вашего приведения вниз / вверх, другими словами — будет вызвана правильная перегруженная функция.

В качестве примечания — если вы действительно хотите вызвать конкретное «воплощение» виртуальной функции, вам придется использовать явное разрешение имен, например:

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