class Shape {
public:
virtual void draw() = 0;
. . .
};
class Circle : public Shape {
public:
void draw() { . . . }
. . .
};
class Rectangle : public Shape {
public:
void draw() { . . . }
. . .
};
class Square : public Rectangle {
public:
void draw() { . . . }
. . .
};Rectangle* rect = new Rectangle;
rect->draw(); // Statically bound to the draw in the Rectangle class
В учебнике «Концепции языка программирования 10-й»,
есть часть о динамическом связывании метода.
я думаю, что тип объекта, на который указывает прямоугольник, не может быть разрешен статически, потому что прямоугольник является полиморфным ссылочным типом.
rect может также ссылаться на объект типа Sqaure во время выполнения.
последняя строка над кодом неверна ??
Концептуально, потому что draw () является виртуальным методом, rect->draw()
всегда будет консультироваться с vtable
из Rectangle
объект, на который указывает rect
,
тем не мение
Если компилятор может доказать, что rect
на самом деле указывает на экземпляр Rectangle
а не какой-то другой класс, который является производным от него, который перекрывает draw()
метод, то разрешено (но не обязательно) обойти полиморфный поиск, тем самым сохраняя пару выборок из памяти.
Рассмотрим следующий пример
int main
{
Shape* cir = new Circle;
Shape* rec = new Rectangle;
Shape* sqr = new Square;
cir->draw(); // Circle::draw
rec->draw(); // Rectangle::draw
sqr->draw(); // Square::draw
}
Все эти переменные cir
, rec
, а также sqr
являются Shape*
, но они будут ссылаться на их соответствующие draw
метод из-за полиморфизма. Это становится еще более понятным, когда мы повторно используем одну и ту же переменную
int main
{
Shape* shape = new Circle;
shape->draw(); // Circle::draw
delete shape;
shape = new Rectangle;
shape->draw(); // Rectangle::draw
delete shape;
shape = new Square;
shape->draw(); // Square::draw
delete shape;
}
В этом случае draw
Функция должна быть решена во время выполнения, потому что основной тип shape
могут быть изменены в течение всего времени выполнения.
Там нет проблем с вашим кодом, для полиморфных классов virtual
вызовы функций разрешаются во время выполнения с использованием таблицы виртуальных функций, которая называется динамическим связыванием в c++
,