Можно создать дубликат:
Public virtual function derived private in C++Почему функция-член все еще доступна, даже если она объявлена как «закрытая»?
class B
{
private:
int b;
public:
B(int i);
virtual void show()
{
cout<<"B::show()called. "<<b<<endl;
}
};
B::B(int i=0)
{
b=i;
}
class D:public B
{
private:
int d;
void show()
{
cout<<"D::show() called. "<<d<<endl;
}
public:
D(int i, int j);
};
D::D(int i=0, int j=0):B(i)
{
d=j;
}
void fun(B&obj)
{
obj.show();
}
/*if I redefine fun() as follow, the result would be the same
void fun(B*obj)
{
obj->show();
}
*/
int main()
{
D *pd=new D(5,8);
fun(*pd); //K
delete pd;
}
Выход программы "D :: шоу() называется.", Что означает виртуальную функцию, объявленную в закрытой части класса D. Вам не кажется странным? Как можно получить доступ к закрытому члену класса извне?
Есть 999999 дубликатов этого вопроса. – Puppy
Спецификаторы доступа ограничивают только те обращения, которые идут извне класса. Итак, если вы напишете удовольствие (D &) или удовольствие (D *), он не сможет получить доступ к D :: show(), используя статическую связь с конкретным классом братьев. Используя базовый класс, который имеет открытый член show(), вы получаете доступ через полиморфный вызов, который проходит через барьер для реализации брака. Ughh! :) Я просто попытался объяснить это более буквально. – parallelgeek