多态性?C++与Java

Polymorphism? C++ vs Java

本文关键字:Java C++ 多态性      更新时间:2023-10-16

作为初学者尝试多态性。我想我正在用不同的语言尝试相同的代码,但结果不一样:

C++

#include <iostream>
using namespace std;
class A {
    public:
    void whereami() {
        cout << "You're in A" << endl;
    }
};
class B : public A {
    public:
    void whereami() {
        cout << "You're in B" << endl;
    }
};
int main(int argc, char** argv) {
    A a;
    B b;
    a.whereami();
    b.whereami();
    A* c = new B();
    c->whereami();
    return 0;
}

结果:

You're in A
You're in B
You're in A

Java:

public class B extends A{
    void whereami() {
        System.out.println("You're in B");
    }
}
//and same for A without extends
//...

public static void main(String[] args) {
    A a = new A();
    a.whereami();
    B b = new B();
    b.whereami();
    A c = new B();
    c.whereami();
}

结果:

You're in A
You're in B
You're in B

不确定我是做错了什么,还是这与语言本身有关?

您需要了解C++的virtual关键字。如果没有该限定符,您的对象中就只有成员函数。它们不遵循多态性(动态绑定)的规则。使用virtual限定符可以获得使用动态绑定的方法。在Java中,所有实例函数都是方法。你总是有多态性。

使用"虚拟函数"。

#include <iostream>
using namespace std;
class A {
    public:
    virtual void whereami() { // add keyword virtual here
        cout << "You're in A" << endl;
    }
};
class B : public A {
    public:
    void whereami() {
        cout << "You're in B" << endl;
    }
};
int main(int argc, char** argv) {
    A a;
    B b;
    a.whereami();
    b.whereami();
    A* c = new B();
    c->whereami();
    return 0;
}

在Java中,默认情况下,所有实例方法都是虚拟函数。

回答有点晚,但在派生类中使用override关键字可以让编译器知道您正在重写。