Вот определение класса:В C++ этот метод вызывает статическое связывание или динамическое связывание?
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() { ... }
... };
А вот код клиента:
Square* sq = new Square;
Rectangle* rect = new Rectangle;
Shape* ptr_shape;
ptr_shape = sq;
ptr_shape->draw();
rect->draw();
Книга, которую я читал сказал, что последнее утверждение является статической привязки:
Однако оператор все еще выглядит динамически привязанным ко мне, потому что rect->draw
должен быть вызван e указатель в «vtable» rect
во время выполнения.
Есть ли у кого-нибудь идеи о том, является ли rect->draw
статической привязкой или динамической привязкой?
'final' будет препятствовать его компиляции. Он запрещает переопределять, а не останавливает его. –
@DmitryRubanovich: Поскольку метод 'final' не может быть переопределен (поэтому, не допуская' Square :: draw'), в качестве оптимизации компилятор может вызывать метод 'final', не используя * vtable *. – Jarod42
компилятор ничего не называет. Он генерирует код, который (метафорически) выполняет вызовы. Компилятор не может генерировать код в подклассе, который переопределяет метод 'final' в суперклассе. Компилятор должен генерировать ошибку времени компиляции, если он встречает такой код. Генерирование кода, которое игнорировало бы виртуальность функции, означало бы нарушение объявления. Другими словами, это не будет оптимизация компилятора. Это будет ошибка компилятора. –