Корректный вызов private функции

164
14 апреля 2019, 08:20

Почему следующая программа выводит B, ведь функция bar вызывает private функцию?

#include <iostream>

struct A {
    virtual void foo() const { std::cout << "A"; }
};
struct B : A {
private:
    void foo() const override { std::cout << "B"; }
};
void bar(const A& a) { a.foo(); }

int main() {
    bar(B{});
}
Answer 1

Это абсолютно нормальная ситуация. 10.8.5 Access to virtual functions [class.access.virt]:

Правила доступа для виртуальных функций определяются по их объявлению и не зависят от того как функция переопределена

class B {
public:
  virtual int f();
};
class D : public B {
private:
  int f();
};
void f() {
  D d;
  B* pb = &d;
  D* pd = &d;
  pb->f();                      // OK: B​::​f() - public, D​::​f() вызвана
  pd->f();                      // error: D​::​f() - private
}

Доступность проверяется в месте вызова используя тип выражения. Какой модификатор доступа у переопределнной функции неизвестно.

READ ALSO
Как вынести функции в класс

Как вынести функции в класс

Помогите вынести функции rangeCheck() и errorMessege() в отдельный класс MyError что бы не нарушить функционал, ибо я уже всё что мне известно перепробовал:(

177
Плагин для работы с полилиниями

Плагин для работы с полилиниями

Здрасьте! Пишу плагин для создания простой полилинииКогда я жму кнопку "Создать", создается полилиния по заранее введенным координатам

152
Метод пересечения строк

Метод пересечения строк

Более развернуто вопрос звучит так: Написать метод пересечения строк, результат должен содержать только те символы которые есть и в первой...

154
Счастливый билетик Задача C++

Счастливый билетик Задача C++

Всем привет, решал задачу, и написал работающее решениеОдна проблема - по всем тестам не проходит по времени

143