Here are my code
    #include <iostream>
    using namespace std;
    class BaseClass
    {
    public:
        BaseClass() {}
        void init(const int object) { cout<<"BaseClass::init"<<endl; }
        void run(const int object) { cout<<"BaseClass::run calls =>";    init(object); }
    };
    
    class Derived : public BaseClass {
    public:
        Derived() {}
        void init(const int object) { cout<<"Derived::init"<<endl; }
    };
    
    int main() {
        BaseClass b;
        b.init('c');
        b.run('c');
    
    
        Derived d;
        d.init(5); // Calls Derived::init
        d.run(5);  // Calls Base::init. **I expected it to call Derived::init**
    }
And here is generated output
BaseClass::init
BaseClass::run calls =>BaseClass::init
Derived::init
BaseClass::run calls =>BaseClass::init
With call d.run(5), Why "BaseClass::init" is being called instead of "Derived::init" ? I though we need virtual functions only when calling through a pointer.
What is the rationale behind keeping such behavior ?
 
     
    