Consider the following code:
#include <iostream>
#include<string>
using namespace std;
 
class Base
{
public:
    virtual string print() const
    {
        return "This is Base class";
    }
};
 
class Derived : public Base
{
public:
    virtual string print() const
    {
        return "This is Derived class";
    }
};
 
void describe(Base p)
{
    cout << p.print() << endl;
}
 
int main()
{
    Base b;
    Derived d;
    describe(b);
    describe(d);
    return 0;
}
On executing this code, it gives the output as
This is Base class
This is Base class
I had couple of doubts in this program:
- The function print in class Base is a const member function, hence after inheritance, when we try to override the definition of print in Derived class, why doesn't the compiler give an error. 
- In this program, how we can we pass a derived class object (d) to the function which expects an argument of data Type Base. 
- Even if we could somehow pass the derived class object to the function, why does it print "This is Base class" instead of "This is Derived Class". 
- Does implicit type-conversion take place when I pass a derived class object to function describe? 
I had be grateful if someone could explain me the working of this code.
 
     
    