私有函数成员在类之外调用

时间:2015-01-22 19:58:46

标签: 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_function"; }
};

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

int main() {
  B b;
  C(b);
}

3 个答案:

答案 0 :(得分:23)

因为标准是这样说的:

  

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

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
}
     

-end example]

示例与您的相同,哈哈。

答案 1 :(得分:6)

private函数可以覆盖基类中的public个虚函数。事实上,在确定某个函数是否覆盖另一个函数时,完全忽略了可访问性,因此即使在

中也是如此
// Redundant private for clarity:
class A { private: virtual void foo(); };
class B : A { public: void foo(); };

B::foo会覆盖A::foo

答案 2 :(得分:4)

编译时期间,C ++编译器会根据类型验证函数和方法的可访问性。在函数C中,变量g是类型A(在编译代码期间检查),其中方法f被声明为public。

查看this link