StraightCirle
StraightCirle

Reputation: 182

Confusion is memory allocation for pointers and virtual functions

I read about virtual functions but i am not able to clear the concept. In the below mentioned example.We are creating a base pointer and assigning base object first and calling function is base class and later assigning derived object and calling its function. Since we have already mentioned which objects will be assigned does not compiler know which object function to call during compilation? I did not get why the decision will be delayed till run time. Am i missing something here.?

#include <iostream>
using std::cout;
using std::endl;

// Virtual function selection
class Base
{
public:
   virtual void print() const
   { 
      cout << "Inside Base" << endl; 
   }
};

class Derived : public Base
{
public:
   // virtual as well
   void print() const
   { 
      cout << "Inside Derived" << endl; 
   }
};

int main()
{
   Base b;
   Derived f;

   Base* pb = &b;  // points at a Base object
   pb->print();    // call Base::print()

   pb = &f;        // points at Derived object
   pb->print();    // call Derived::print()
}

Upvotes: 0

Views: 294

Answers (4)

Lightness Races in Orbit
Lightness Races in Orbit

Reputation: 385204

Since we have already mentioned which objects will be assigned does not compiler know which object function to call during compilation? I did not get why the decision will be delayed till run time.

In this very specific, contrived case, your compiler can optimise out all the polymorphism, yes.

Am i missing something here.?

The imagination to realise that the vast majority of code in real life is not this simple. There are infinitely many C++ programs for which the compiler does not have enough information to perform this optimisation.

Upvotes: 1

Don Larynx
Don Larynx

Reputation: 695

Due to the fact that it is virtual, it is able to dynamically bind the function to the correct object. This means that the pointer calling the function will call the referenced object's function.

Upvotes: 0

Sanjay R
Sanjay R

Reputation: 26

As per my understanding, the compiler will just look at the reference type at compile time and bind the function defined and declared in that class. Since the Derived -> print() should be called you have to make the print function virtual in the base class so that the compiler will delay the binding to run time and use the function defined in the derived class.

Upvotes: 0

juanchopanza
juanchopanza

Reputation: 227418

In your particular case, the compiler could potentially figure out the type of the objects being pointer at by the base class pointer. But the virtual dispatch mechanism is designed for situations in which you do not have this information at compile time. For example,

int n;
std::cin >> n;

Base b;
Derived d;

Base* pb = n == 42 ? &b : &d;

Here, the choice is made based on user input. The compiler cannot know what pb will point to.

Upvotes: 5

Related Questions