Здравствуйте, rg45, Вы писали:
S>>Пришел к выводу, что причина спора в этом обсуждении в том, что часть участников (Лазар, Marty, watchmaker) придерживаются той точки зрения, что механизм виртуальной диспетчеризации работает потому, что он работает именно так, как описано в стандарте. Т.е. если в программе происходит именно то, что и следует по стандарту языка C++, то значит все работает и работает так, как надо.
R>Так стандарт же описывает каким должно быть поведение программы, а не детали реализации этого поведения. И единиственный вывод, который можно сделать из стандарта как раз тот самый — что вызов виртуальных функции из конструкторов/деструкторов даёт тот же эффект, что и прямой невиртуальный вызов.
Ну не совсем:
class c1 {
virtual void f() {...};
...
};
class c2 : public c1 {
void f() override {...};
...
};
class c3 : public c2 {
... // нет своей версии f().
};
class c4 : public c3 {
public:
c4() { f(); }
};
В конструкторе c4 мы не делаем прямой вызов c2::f, но именно эта версия и будет вызвана.