## Перегрузка виртуальных функций
```cpp
class B {
public:
	virtual void f(int);
	virtual void f(float);  //перегруженные функции
};

class D : public B {
public:
	void f(int);  //замещает B::f(int), скрывает B::f(float)
}

int main() {
	D d;
	B b;
	*pb = &d;
	b.f(9);
	b.f(9.5);
	d.f(9);  //D::f(int)
	d.f(9.5);  //B::f(float)
	pb->f(9);  //D::f(int) - замещает B::f(int)
	pb->f(9.5);  //B::f(float) - наследование
}
```
## Чисто виртуальные функции
```cpp
class shape {
public:
	virtual int S() = 0;  //отлженный метод
protected:
	int x, y;
};

class shape_1 : public shape {
public:
	int S() const {
		return (h * w);
	}
private:
	int h, w;
};

class shape_2 : public shape {
public:
	int S() const {
		return (PI * r * r);
	}
private:
	int r;
};

int main() {
	shape_1 n1, n2, n3, * pn;
	shape_2 o1, o2, o3, * po;

	n1.s();
	n2.s();
	n3.s();

	o1.s();
	o2.s();
	o3.s();

	pn->s();
	po->s();

	//shape_1
	p = &n1;
	p->s();
	p = &n2;
	p->s();
	p = &n3;
	p->s();

	//shape_2
	p = &o1;
	p->s();
	p = &o2;
	p->s();
	p = &o3;
	p->s();

	ss += p->s();
}
```
Иерархия классов в коде выше:  
![Иерархия классов shape, shape_1 и shape_2](13_01.%20Иерархия%20классов%20shape,%20shape_1%20и%20shape_2.png)  
![Иерархия классов shape, shape_1 и shape_2](13_02.%20Иерархия%20классов%20shape,%20shape_1%20и%20shape_2.png)  
Если в классе есть хотя бы одна чисто виртуальная функция, то такой класс становится абстрактным базовым классом. Этот класс не может иметь собственных объектов и предназначен для объявления указателей.
## Классы-интерфейсы
Класс-интерфейс содержит только объявление сервисов и услуг, которые мы можем получить. Классы-интерфейсы - важный элемент иерархий родственных классов.
```cpp
class shape_i {
public:
	virtual int s() = 0;
	virtual int p() = 0;
	virtual void print() = 0;
};

class shape : public shape_i {

};
```
Иерархия с классом-интерфейсом:  
![Иерархия с классом-интерфейсом shape_i](13_03.%20Иерархия%20с%20классом-интерфейсом%20shape_i.png)