# Understanding virtual function

``````// multiple inheritance
#include <iostream>
using namespace std;

class Polygon {
protected:
int width, height;
public:
Polygon (int a, int b) : width(a), height(b) {}
virtual int area()=0;
virtual void print(){
cout << "area = " << area() << endl;
};
};

class Rectangle: public Polygon{
public:
Rectangle (int a, int b) : Polygon(a,b) {}
int area () { return width*height; }
void print(){
cout << "area = " << area() << endl;
};
};

class Square: public Rectangle{
public:
Square (int a, int b) : Rectangle(a,b) {}
int area () { return width*height/2; }
};

int main () {
Square sq (4,5);
sq.print ();
return 0;
}
```

```

In this function, print the call area () of a square (not a rectangle). What for? Since area () in Rectangle is not virtual, it must call area () from Rectangle. The end result is 10. For me, it should be 20.

+3

source to share

Since `area()`

in is `Rectangle`

not virtual, it must call `area()`

from`Rectangle`

In fact, this`virtual`

is since it was declared `virtual`

in the base class. This attribute is automatically wrapped in function declarations of inherited classes.

See the standard, Virtual Functions [class.virtual] (emphasis mine):

If a virtual member function is `vf`

declared in class Base and in a class Derived obtained directly or indirectly from Base, a member function of `vf`

the same name, parameter list (8.3.5), cv-qualification and refqualifier (or no same) as and `Base::vf`

, then Derived :: vf is also virtual ( no matter declared ) and it overrides `Base::vf`

.

Side note. Derivald square from rectangle can be problematic because it violates Liskov's substitution principle.

+4

source

All Articles