为什么在Java和C++中,继承通过超类调用(或不调用)子类的方法来表现不同? - java

我已经写了-似乎是-Java和C++中完全相同的继承示例。看到这些程序的不同输出,我感到非常惊讶。让我分享代码片段和相应的输出。

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)

我不知道为什么这两个继承示例的行为有所不同。它不应该类似地工作吗?
这种情况的解释是什么?

参考方案

在您的C++示例中,您是hiding基本方法,但是您没有覆盖它们。因此,它们实际上是不同的方法,它们恰好具有相同的名称。如果您在打电话

A* a = new B();
a->sleep();

它实际上会打印"A.Sleep"。如果要覆盖方法,则需要在基类中将其声明为 virtual (也自动在所有子类中使其虚拟化)。您可以在this post中阅读有关C++中函数隐藏与覆盖的更多信息。

在您的Java示例中,您实际上覆盖了方法,因此它们是相同的方法。一个代替旧的。您可以这样想:所有Java函数都被秘密标记为virtual,这意味着它们可以被覆盖。如果要使方法在Java中不可重写,则必须将其声明为 final

在Java中,执行“ ++++++++”表达式,编译器未报告任何错误并且可以正确执行? - java

我用eclipse编写了这段代码,用war写过,结果为3d。public static void main(String[] args) { double a = 5d + + + + + +-+3d; System.out.println(a); } 参考方案 您的表情可以改写为(5d) + (+ + + + +-+3d) 其中第一个+是应用于两个操作数的…

Java值加变量++ - java

考虑以下代码int val1 = 3; val1++; int val2 = val1++; System.out.println(val1); System.out.println(val2); Val1值= 5;Val2值= 4;为什么Val1的值是“ 5”?据我了解,应该为4,因为:在第1行,它的赋值为3,在第2行,通过val1 ++加上1,结果val…

我可以使用JNI在Java代码中引用C++对象吗? - java

我在任何地方都没有看到(或者也许我很简单,没有看到它),但是有没有办法使用JNI返回c / c ++对象并在Java中使用该对象?例如(非常简单):class simpleClass{ ... private: int intVar; public: int getIntVar(); void setIntVar(int someNum); ... } 在我…

为什么C++中的void方法可以返回void值,而在其他语言中却不能呢? - java

该程序可以用C ++编译并运行,但不能使用多种不同的语言,例如Java和C#。#include <iostream> using namespace std; void foo2() { cout << "foo 2.\n"; } void foo() { return foo2(); } int main() {…

如何在C++应用程序中访问Java方法 - java

只是一个简单的问题:是否可以从c / c ++调用Java函数? 参考方案 是的,可以,但是有点麻烦,并且可以以反射/非类型安全的方式工作(示例使用的C++ API比C版本更清洁)。在这种情况下,它将从C代码中创建Java VM的实例。如果首先从Java调用您的本机调用,则无需构造VM实例#include<jni.h> #include<s…