多态性? C++ 与 Java

Posted

技术标签:

【中文标题】多态性? C++ 与 Java【英文标题】:Polymorphism? C++ vs Java 【发布时间】:2015-12-24 00:03:56 【问题描述】:

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

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

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

【问题讨论】:

您在第一个程序中的whereami 中缺少virtual 关键字... @Reimeus:OP 也忘记在 Base 类中提供虚拟析构函数并写 delete c;在 main() 函数中。 【参考方案1】:

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

【讨论】:

使用 virtual 限定符,它们仍然是成员函数。 C++ 不使用术语“方法”。有虚成员函数和非虚成员函数。不过,撇开术语不谈,答案是正确的。 我永远不会和 Pete Becker 争论 C++。 我忘了说,除了术语,这个答案是正确的。【参考方案2】:

使用“虚函数”。

#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中,所有的实例方法默认都是虚函数。

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于多态性? C++ 与 Java的主要内容,如果未能解决你的问题,请参考以下文章

C++编程题 关于 继承和多态 的

C++基础——C++面向对象之重载与多态基础总结(函数重载运算符重载多态的使用)

什么是多态性,C++中是如何实现多态的

C++中多态是怎样实现的?

C++之多态性与虚函数

Java多态的理解