Почему следующая программа выводит 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{});
}
Это абсолютно нормальная ситуация. 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
}
Доступность проверяется в месте вызова используя тип выражения. Какой модификатор доступа у переопределнной функции неизвестно.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей