私有方法的动态绑定:java vs C++
这在Java中是不允许的:
class A {
public void method() {}
}
class B extends A {
private void method() {}
}
它生成一个编译错误:
error: method() in B cannot override method() in A
attempting to assign weaker access privileges; was public
但是,这在C++中是允许的:
class A {
public:
virtual void method() {}
};
class B : public A {
private:
void method() {}
};
int main(void) {
A* obj = new B();
obj->method(); // B::method is invoked, despite it being private
}
< C++中的这种行为背后的逻辑是什么?
# 1 楼答案
至于虚拟私有方法部分,这允许实现NVI pattern,以便在使用继承的情况下执行不变检查或设置/分解
下面是一个带有锁和后条件验证的示例:
在Java中,这可以通过受保护的方法实现,但这会将实现细节泄露给派生类的派生类,而这些派生类可能是不需要的
至于私有化公共成员部分,如果有人突然在
base
中公开function_impl
,它不会破坏派生类。我并不是说这是一个很好的想法,但是C++通常假设你知道你在做什么,因此它是一种如此灵活的语言。p># 2 楼答案
A::method
,它是而不是私有的。具体实现声明为私有,但这仅在以编译器可见的方式直接调用此实现时才相关,即,如果您试图通过^{逻辑由下面的例子说明:想象如果{{CD3}}没有从^ {{CD5>}继承,而是私下的——这是C++中允许的,并且当继承本身是实现细节时使用,例如对于从{{CD7>}继承的^ {< CD6>}类,但不希望暴露向量接口。在这种情况下,
B::method
是不可访问的,但是A::method
工作正常,即使对象是B
实例正如Kerrek SB所说,Java正在保护您免受一类错误的影响,代价是删除合法选项