0

Can someone explain the reason for the non-polymorphic behavior of this piece of simple C++ code?

// src/main.cpp
#include <iostream>

class Base {
public:
    Base() {
        std::cout << "Making Base" << std::endl;
    }
    virtual void hello() {
        std::cout << "Hello Base" << std::endl;
    }
};

class Derived : public Base {
public:
    Derived() {
        std::cout << "Making Derived" << std::endl;
    }
    void  hello() override {
        std::cout << "Hello Derived" << std::endl;
    }
};

int main() {
    Base* bp = new Derived();
    // Making Base
    // Making Derived
    bp->hello();
    // Hello Derived

    Base b = Derived();
    // Making Base
    // Making Derived
    b.hello();
    // Hello Base
}

Compile and run:

% g++ -std=c++14 -Wall -o obj/main.o -c src/main.cpp
% g++ -std=c++14 -Wall -o app obj/main.o
% ./app
Making Base
Making Derived
Hello Derived
Making Base
Making Derived
Hello Base

I would have expected b.hello() to generate output Hello Derived, or cause a compiler warning/error.

Morten
  • 311
  • 4
  • 8

0 Answers0