## Перегрузка виртуальных функций ```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)