Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Polymorphism? C++ vs Java

Trying out polymorphism as a beginner. I think I am trying the same code in different languages, but the result is not the same :

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;
}

Results :

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();
}

Results :

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

Not sure if i'm doing something wrong, or this has to do with the languages themselves?

like image 372
iviO Avatar asked Dec 24 '15 00:12

iviO


2 Answers

You need to read up about the virtual keyword for C++. Without that qualifier, what you have are member functions in your objects. They don't follow the rules of polymorphism (dynamic binding). With the virtual qualifier you get methods, which use dynamic binding. In Java, all instance functions are methods. You always get polymorphism.

like image 145
LIProf Avatar answered Oct 10 '22 06:10

LIProf


Use "virtual functions".

#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;
}

In Java, all instance methods are virtual functions in default.

like image 44
MikeCAT Avatar answered Oct 10 '22 08:10

MikeCAT