【发布时间】:2013-11-24 22:27:15
【问题描述】:
这在 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++ 中这种行为背后的逻辑是什么?
【问题讨论】:
-
Java 针对 90% 的用例进行了优化。 C++ 优化了 10%。
-
Java 更容易掌握。它比 C++ 对你的约束更多,希望大多数“理智”的程序都能适应这些约束,从而减少你犯错的空间。
-
С++ 和 Java 是用于不同目的的不同语言。
-
实际上,
A::method()正在被调用。作为虚拟,它会按照设计获得多态行为。 -
@sehe 我明白你的意思,但是当你在
A::method和B::method中分别打印时,很难说A::method正在被调用,只有后一个打印被执行。
标签: java c++ private dynamic-binding