多态?C++ vs Java

8
作为初学者尝试多态性。我想我正在尝试在不同的语言中使用相同的代码,但结果并不相同:
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

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


7
在第一个程序中,whereami 函数中缺少 virtual 关键字。请添加该关键字,但不要改变原意。 - Reimeus
@Reimeus:OP 还忘记在基类中提供虚析构函数并在 main() 函数中编写 delete c;。 - Destructor
3个回答

10

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


2
使用虚拟限定符,它们仍然是成员函数。C++不使用术语“方法”。有虚拟成员函数和非虚拟成员函数。尽管术语不同,但答案是正确的。 - Pete Becker
我永远不会和Pete Becker争论C++。 - LIProf
我忘了说,除了术语外,这个答案是正确的。 - Pete Becker

5
使用"虚函数"。
#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中,默认情况下,所有实例方法都是虚函数。

0

回答有点晚了,但在派生类中使用override关键字让编译器知道你正在覆盖。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接