Здравствуйте, rg45, Вы писали:
R>В точке (3) компилятор не знает, какой будет метод вызван и вынужден использовать позднее связывание. А в точке (1) компилятор уже во время компиляции знает, что здесь может быть вызван только s1::f, без вариантов. Да, он может сделать этот вызов через механизм позднего связывания. Только зачем?
Извините, но вот эта часть мне не интересна от слова совсем.
И, как мне кажется, обсуждаемая глава книги вовсе не про то, что знает компилятор во время компиляции.
PS. Для разнообразия чуть измените конструктор s1:
struct s1 {
virtual void f() { std::cout << "s1::f" << std::endl; }
s1() {
call_f();
}
void call_f();
};
// Где-то совсем в другом месте, возможно даже в другой единице трансляции.
void s1::call_f() {
this->f(); // (3)
}
У нас теперь нет точки (1) в которой компилятор что-то точно знает.
Зато есть точка (3), которая на разных путях к call_f приводит к разному наблюдаемому поведению.