Здравствуйте, rg45, Вы писали:
S>>А значит, с формальной точки зрения, виртуальная диспетчеризация работает.
R>Ну, это никак не проверяется через поведение программы. Результаты же идентичны.
Почему не проверяется? Согласно стандарту при вызове f() в конструкторе c4 мы получаем вызов наиболее свежей к этому времени версии f -- c2::f.
Значит все работает.
Аналогичная точка зрения у моих "оппонентов" и на ситуацию:
struct c1 {
~c1() { f(); }
virtual void f() { std::cout << "c1::f" << std::endl; }
};
struct c2 : public c1 {};
struct c3 : public c2 {
void f() override { std::cout << "c3::f" << std::endl; }
};
int main() {
c3 c;
}
В деструкторе c1 будет вызвана наиболее свежая к этому времени версия f -- c1::f, а не c3::f.
В точности согласно стандарта, а значит все работает как и предписано. А значит все работает.
Т.е. работа "по стандарту" вполне себе проверяется через работу программы.
Вынужден повториться, но проблема здесь не в стандарте или возможности проверить работу согласно стандарта. А в том, что у части пользователей C++ другие ожидания от вызова виртуального метода в конструкторе/деструкторе.