Re[13]: Книжка по UB
От: rg45 СССР  
Дата: 14.08.25 08:35
Оценка:
Здравствуйте, so5team, Вы писали:

S>Ну не совсем:

S>
S>class c1 {
S>  virtual void f() {...};
S>  ...
S>};

S>class c2 : public c1 {
S>  void f() override {...};
S>  ...
S>};

S>class c3 : public c2 {
S>  ... // нет своей версии f().
S>};

S>class c4 : public c3 {
S>public:
S>  c4() { f(); }
S>};
S>


S>В конструкторе c4 мы не делаем прямой вызов c2::f, но именно эта версия и будет вызвана.


Так мы в этом случае и просто f() не сможем вызвать. И оба вызова: f() и c4::f() создадут одинаковые ошибки компиляции. Тут не стоит забывать, что в данном случае c2::f — она же с3::f, она же c4::f. Т.е. даже в таком случае выходит, что эти вызовы неотличимы:

http://coliru.stacked-crooked.com/a/102a88c2bfba9e66

class c1 {
  virtual void f() {};
};

class c2 : public c1 {
  void f() override {};
};

class c3 : public c2 {
  // нет своей версии f().
};

class c4 : public c3 {
public:
  c4() {
      f();      // error: 'virtual void c2::f()' is private within this context
      c4::f();  // error: 'virtual void c2::f()' is private within this context
    }
};

int main() {
}


Если добавить спецификацю доступа public в с2 ошибка уйдёт, но, опять же, от обоих вызовов — виртуального и невиртуального получим одинаковый эффект.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 14.08.2025 8:39 rg45 . Предыдущая версия . Еще …
Отредактировано 14.08.2025 8:38 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.