【发布时间】:2018-04-12 11:40:56
【问题描述】:
我在 Java 和 C++ 中写过 - 似乎是 - 完全相同的继承示例。看到这些程序的不同输出,我真的很惊讶。让我分享一下代码 sn-ps 和相应的输出。
C++ 代码:
class A
{
public:
A() {}
void sleep() {
cout << "A.Sleep" << endl;
eat();
}
void eat() {cout << "A.Eat" << endl;}
};
class B: public A
{
public:
B() {}
void sleep() {
A::sleep();
cout << "B.Sleep " <<endl;
this->eat();
}
void eat() {
cout << "B.Eat" << endl;
run();
}
void run() {
A::sleep();
cout << "B.run" << endl;
}
};
int main()
{
B *b = new B();
b->sleep();
}
输出:
A.Sleep
A.Eat
B.Sleep
B.Eat
A.Sleep
A.Eat
B.run
executed successfully...
Java 代码:
class A
{
A() {}
void sleep() {
System.out.println("A.Sleep");
this.eat();
}
void eat() { System.out.println("A.Eat");}
};
class B extends A
{
B() {}
@Override
void sleep() {
super.sleep();
System.out.println("B.Sleep");
this.eat();
}
@Override
void eat() {
System.out.println("B.Eat");
run();
}
void run() {
super.sleep();
System.out.println("B.Run");
}
}
public class Test {
public static void main(String[] args) {
B b = new B();
b.sleep();
}
}
输出:
A.Sleep
B.Eat
A.Sleep
B.Eat
A.Sleep
......
......
......
(Exception in thread "main" java.lang.StackOverflowError)
我不知道为什么这两个继承示例的行为不同。它不应该同样工作吗?
这种情况的解释是什么?
【问题讨论】:
-
在 Java 中,所有方法都是虚拟的(即可以被覆盖)。在 C++ 中它们不是。如果你给一个子类一个与基类中的非虚拟方法同名的方法,它们只是两个名称相似的方法。
-
我会将标题/问题更改为“What 在这种情况下 C++ 和 Java 继承有什么区别?”,因为 为什么?只是因为c++和java是两种不同的语言
-
为什么不一样呢?在两种不相关的语言之间进行比较通常会适得其反。
-
因为Java中的方法默认是dynamic bounded。
-
“我用 Java 和 C++ 编写了完全相同的继承示例”——不,你没有。您试图尽可能接近相同的语法(但使用 override 关键字做得不够)。
标签: java c++ inheritance