在类外调用的私有函数成员
Posted
技术标签:
【中文标题】在类外调用的私有函数成员【英文标题】:Private function member called outside of class 【发布时间】:2015-01-22 19:58:46 【问题描述】:在下面的例子中,为什么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);
【问题讨论】:
因为它在 A 中是公共的,大概是因为 A 是父级并且您从 A 对象中使用它,所以它不需要检查子级的范围,它只是被它在 A 中公开的事实所覆盖。只是我的想法。 您所说的解释了它-C
中的g
的静态类型是A&
,而f()
是A
的公共成员函数。这就是访问控制所关心的。将C()
的参数类型更改为B&
,你的代码将无法编译。
【参考方案1】:
因为标准是这样说的:
[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
——结束示例]
这个例子和你的一样,哈哈。
【讨论】:
【参考方案2】:private
函数可以覆盖基类中的public
虚函数。事实上,在确定一个函数是否覆盖另一个函数时,可访问性被完全忽略了,所以即使在
// Redundant private for clarity:
class A private: virtual void foo(); ;
class B : A public: void foo(); ;
B::foo
覆盖 A::foo
。
【讨论】:
这个例子不是很有趣,因为B
像A
一样声明foo
私有,并且它是私有继承的。
@LightnessRacesinOrbit 已调整。
它仍然是私有继承。这是故意的吗?如果是这样,是否也考虑在其中添加private
?
@LightnessRacesinOrbit 是的,这是故意的。关键的事实是,B
中的 foo 是 public
,A
中的 foo 是 private
。实际上它与我以什么方式得出完全无关,因为A::foo
最终还是无法访问。【参考方案3】:
在编译时间期间,C++ 编译器根据函数和方法的类型验证其可访问性。在函数 C 中,变量 g 属于 A 类型(在编译代码期间检查),其中方法 f 被声明为 public。
看看this link
【讨论】:
以上是关于在类外调用的私有函数成员的主要内容,如果未能解决你的问题,请参考以下文章