Динамическая привязка метода

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 во время выполнения.

последняя строка над кодом неверна ??

-1

Решение

Концептуально, потому что draw () является виртуальным методом, rect->draw() всегда будет консультироваться с vtable из Rectangleобъект, на который указывает rect,

тем не мение

Если компилятор может доказать, что rect на самом деле указывает на экземпляр Rectangle а не какой-то другой класс, который является производным от него, который перекрывает draw() метод, то разрешено (но не обязательно) обойти полиморфный поиск, тем самым сохраняя пару выборок из памяти.

0

Другие решения

Рассмотрим следующий пример

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 могут быть изменены в течение всего времени выполнения.

2

Там нет проблем с вашим кодом, для полиморфных классов virtual вызовы функций разрешаются во время выполнения с использованием таблицы виртуальных функций, которая называется динамическим связыванием в c++,

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector