以下代码打印出"I'm B!"。这有点奇怪,因为B::foo()是私有的。关于A* ptr,我们可以说它的静态类型是A(foo是公共的),动态类型是B(foo是私有的)。因此,我可以通过指向A的指针调用foo。但是这样我就能访问B中的私有函数。这是否可以被视为封装违规?
由于访问限定符不是类方法签名的一部分,因此可能会导致这种奇怪的情况。为什么在C++中覆盖虚函数时不考虑访问限定符?我能否禁止这种情况?这个决定背后的设计原则是什么? 实时示例。
由于访问限定符不是类方法签名的一部分,因此可能会导致这种奇怪的情况。为什么在C++中覆盖虚函数时不考虑访问限定符?我能否禁止这种情况?这个决定背后的设计原则是什么? 实时示例。
#include <iostream>
class A
{
public:
virtual void foo()
{
std::cout << "I'm A!\n";
};
};
class B: public A
{
private:
void foo() override
{
std::cout << "I'm B!\n";
};
};
int main()
{
A* ptr;
B b;
ptr = &b;
ptr->foo();
}
A::foo()
,这是公共的。你不能直接调用b.foo()
。最重要的问题是为什么B::foo
是私有的? - Bo Perssonvoid f(A* a) { a->foo(); }
是在另一个编译的文件中。那么,编译器如何知道您是否稍后传递的是B
,C
还是A
?接口声明该函数为公共函数,因此它就是公共函数。 - Bo PerssonA::foo
方法。由于没有封装违规发生,因此这不是封装违规。即使A::foo
(非虚拟)调用了一些私有方法或修改了一些私有字段,也不会发生封装违规。如果该方法被保留为公共方法,但执行了外部代码不应被允许的操作,则可能出现封装违规。 - user7860670class final
特性出现之前,我故意使用这种东西。 - user0042