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;
}