#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