C++ 在类外调用的私有函数成员

C++ 在类外调用的私有函数成员,c++,c++11,C++,C++11,在下面的示例中,为什么调用B::f(),即使它是私有的 我知道这个事实: 在调用点使用用于表示调用成员函数的对象的表达式类型检查访问 #include <iostream> class A { public: virtual void f() { std::cout << "virtual_function"; } }; class B : public A { private: void f() { std::cout << "private_f

在下面的示例中,为什么调用
B::f()
,即使它是私有的

我知道这个事实: 在调用点使用用于表示调用成员函数的对象的表达式类型检查访问

#include <iostream>

class A {
public:
  virtual void f() { std::cout << "virtual_function"; }
};

class B : public A {
private:
  void f() { std::cout << "private_function"; }
};

void C(A &g) { g.f(); }

int main() {
  B b;
  C(b);
}
#包括
甲级{
公众:

虚空FE({STD::CUT< P>)在<强>编译时< /强> C++编译器中根据函数的类型验证函数和方法的可访问性。在函数C中,变量G是A类型(在编译代码期间检查),其中方法F被声明为公共。
看看

私有
函数可以从基类重写
公共
虚拟函数。事实上,在确定一个函数是否重写另一个函数时,可访问性完全被忽略,因此即使在

// Redundant private for clarity:
class A { private: virtual void foo(); };
class B : A { public: void foo(); };

B::foo
覆盖
A::foo

,因为标准如此规定:

[C++11:11.5/1]:
虚拟函数的访问规则(第11条)由其声明确定,并且不受后来覆盖它的函数的规则的影响。[示例:

-[结束示例]


这个例子和你的一样,lol。

因为它在A中是公共的,大概是因为A是父对象,你从A对象使用它,它不需要检查子对象上的范围,它只是被A中的公共事实所覆盖。这就是我的想法。你所说的解释了它-静态类型的
gC
中的de>是
A&
,而
f()
A
的公共成员函数。这就是访问控制所关心的。更改
C()的参数类型为<代码> b和<代码>,您的代码将无法编译。这个例子不太有趣,因为<代码> B/<代码>声明<代码> FoO 私有,就像<代码> A<代码>,它私下继承。@ LexNeasraceSin轨道调整。它仍然有私有继承。这是故意的吗?如果是这样,考虑添加<代码>。那里也是私有的吗?@LightnessRacesinOrbit是的,这是故意的。关键的事实是
B
中的foo是
public
,而
A
中的foo是
private
。实际上,它与我的推导方式完全无关,因为
A::foo
最终还是无法访问。
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() is public,
                 // D::f() is invoked
  pd->f();       // error: D::f() is private
}