0

I am looking into this example. It stated that while a specifier virtual is added into the base class, the compiler can recognize polymorphism, in turn, it will automatically choose the relative member function in the derived class. I am curious about the original structure in the memory. When it is defined as " shape = &rec; shape->area(); ", I wonder why the compiler can know that it is calling the derived class's function (area() of Rect), as 'shape' belongs to the class of shape, not Rect. How does the compiler check?

In my view, the functions used in base class call the functions in the derived class is not proper. I think that when a class 'shape' is declared at the beginning, 'shape' can only know its function by the header of describing shape's information, as the memory is fixed. How does the compiler know what is calling for?

  #include <iostream> 
  using namespace std;

    class Shape {
       protected:
          int width, height;
       public:
          Shape( int a=0, int b=0)
          {
             width = a;
             height = b;
          }
          virtual int area()
          {
             cout << "Parent class area :" <<endl;
             return 0;
          }
    };


class Rectangle: public Shape{
   public:
      Rectangle( int a=0, int b=0):Shape(a, b) { }
      int area ()
      { 
         cout << "Rectangle class area :" <<endl;
         return (width * height); 
      }
};
class Triangle: public Shape{
   public:
      Triangle( int a=0, int b=0):Shape(a, b) { }
      int area ()
      { 
         cout << "Triangle class area :" <<endl;
         return (width * height / 2); 
      }
};
// Main function for the program
int main( )
{
   Shape *shape;
   Rectangle rec(10,7);
   Triangle  tri(10,5);

   // store the address of Rectangle
   shape = &rec;
   // call rectangle area.
   shape->area();

   // store the address of Triangle
   shape = &tri;
   // call triangle area.
   shape->area();

   return 0;
}
user3217504
  • 105
  • 1
  • 3
  • 14
  • Look into "virtual function tables", also called "vtables". These are an implementation detail of the compiler, except pretty much every compiler ever uses them. It may help you to see the concrete explanation for how it is able to track the function it should invoke. – VoidStar May 25 '15 at 05:56
  • It at-least-appears you're trying to understand how a [*virtual method table* (aka: *vtable*)](http://en.wikipedia.org/wiki/Virtual_method_table) works – WhozCraig May 25 '15 at 05:57
  • Internally, C++ keeps a VTable for each class - a collection of pointers to all virtual functions. Derived classes have their own vtable with the same layout but (possibly) different contents. At compile time, virtual functions are set to use the vtable pointer while normal ones can just call the code directly. At runtime, the code ends up being redirected by the vtable to the correct place. – Mike May 25 '15 at 06:02
  • Thank you. I know more about vtable now. – user3217504 May 25 '15 at 06:16
  • While you are learning this stuff it take the habit of adding the 'override' keyword on virtual function definition in derived classes. Otherwise it is easy to add an overload instead. – marom May 25 '15 at 06:50

0 Answers0