---
title: Полиморфизм и наследование
seo:
  title: Полиморфизм и наследование — C++ Developer
  description: Тема «Полиморфизм и наследование» для собеседования C++ Developer. Что такое полиморфизм? Для чего используется наследование?
---

[Все темы C++ Developer](/c-developer)

## <strong>Что такое полиморфизм?</strong> [#q-14bee738d69b812aa1b5e922b3c299af]

Полиморфизм в C++ — это способность функций и методов работать с объектами разных типов, объединённых общим базовым типом, через единый интерфейс. Полиморфизм позволяет создавать гибкие и расширяемые программы.

#### Основные виды полиморфизма&#58;

{/* prettier-ignore */}
1. <strong>Компиляционный</strong> <code>&#40;статический&#41;</code> <strong>полиморфизм</strong>&#58;

    - Достигается через перегрузку функций и шаблоны.

    - Пример&#58; Перегрузка функций.

        ```cpp
        void print(int i);
        void print(double d);
        ```

1. <strong>Исполнительный</strong> <code>&#40;динамический&#41;</code> <strong>полиморфизм</strong>&#58;

    - Достигается через виртуальные функции и наследование.

    - Пример&#58; Виртуальные функции.

        ```cpp
        class Base {
        public:
            virtual ~Base() = default;

            virtual void display() const {
                std::cout << "Base display" << std::endl;
            }
        };

        class Derived : public Base {
        public:
            void display() const override {
                std::cout << "Derived display" << std::endl;
            }
        };

        void show(const Base& b) {
            b.display();
        }
        ```

#### Пример использования&#58;

```cpp
Base* b = new Derived();
b->display();  // Вызов метода Derived через указатель на Base
delete b;
```

:::note[Ссылки для изучения]

1. [Наследование и полиморфмизм в C++](https://education.yandex.ru/handbook/cpp/article/inheritance-and-polymorphism)
   :::

---

## <strong>Для чего используется наследование?</strong> [#q-14bee738d69b81cdbd44cc78c41682a0]

Наследование в C++ используется для&#58;

1. <strong>Повторного использования кода</strong>&#58; Позволяет производным
   классам использовать свойства и методы базового класса, уменьшая дублирование
   кода.

   ```cpp
   class Base {
   public:
       void commonFunction() { /* ... */ }
   };

   class Derived : public Base {
       // Использует commonFunction() из Base
   };
   ```

1. <strong>Создания иерархий классов</strong>&#58; Организует классы в иерархию,
   где производные классы расширяют или уточняют поведение базового класса.

   ```cpp
   class Animal {
   public:
       void eat() { /* ... */ }
   };

   class Dog : public Animal {
       void bark() { /* ... */ }
   };
   ```

1. <strong>Полиморфизма</strong>&#58; Позволяет обрабатывать объекты производных
   классов через указатели или ссылки на базовый класс, что упрощает работу с
   различными, но связанными типами.

   ```cpp
   class Base {
   public:
       virtual void display() { /* ... */ }
   };

   class Derived : public Base {
   public:
       void display() override { /* ... */ }
   };

   void show(Base* b) {
       b->display();
   }
   ```

:::note[Ссылки для изучения]

1. [Наследование и полиморфмизм в C++](https://education.yandex.ru/handbook/cpp/article/inheritance-and-polymorphism)
   :::

---

## <strong>Какие бывают типы наследования?</strong> [#q-14bee738d69b8159b964c41e21fe36bd]

В C++ существуют три основных типа наследования, определяющие доступ производного класса к членам базового класса&#58;

{/* prettier-ignore */}
1. <strong>Публичное наследование (</strong><code>public</code><strong>)</strong>&#58;

    - Доступ к публичным членам базового класса остаётся публичным.

    - Доступ к защищённым членам базового класса остаётся защищённым.

    - Приватные члены базового класса остаются недоступными.

    ```cpp
    class Base {
    public:
        int publicMember;
    protected:
        int protectedMember;
    private:
        int privateMember;
    };

    class Derived : public Base {
        // publicMember - public
        // protectedMember - protected
        // privateMember - недоступен
    };
    ```

1. <strong>Защищённое наследование (</strong><code>protected</code><strong>)</strong>&#58;

    - Доступ к публичным и защищённым членам базового класса становится защищённым.

    - Приватные члены базового класса остаются недоступными.

    ```cpp
    class Derived : protected Base {
        // publicMember - protected
        // protectedMember - protected
        // privateMember - недоступен
    };
    ```

1. <strong>Приватное наследование (</strong><code>private</code><strong>)</strong>&#58;

    - Доступ к публичным и защищённым членам базового класса становится приватным.

    - Приватные члены базового класса остаются недоступными.

    ```cpp
    class Derived : private Base {
        // publicMember - private
        // protectedMember - private
        // privateMember - недоступен
    };
    ```

:::note[Ссылки для изучения]

1. [Наследование и полиморфмизм в C++](https://education.yandex.ru/handbook/cpp/article/inheritance-and-polymorphism)
   :::

---

## <strong>Как запретить наследовать класс?</strong> [#q-14bee738d69b81699f85c69cf9f57143]

Чтобы запретить наследование класса в C++, можно использовать <code>final</code>&#58;

<strong>Пример&#58;</strong>

```cpp
class MyClass final {
    // Тело класса
};
```

Класс, объявленный с <code>final</code>, не может быть базовым классом. Попытка унаследовать такой класс вызовет ошибку компиляции.

Также можно запретить переопределение виртуального метода с помощью final&#58;

```cpp
class Base {
public:
    virtual void someMethod() final {
        // Метод не может быть переопределён в производных классах
    }
};

class Derived : public Base {
    // void someMethod() override; // Ошибка компиляции
};
```

:::note[Ссылки для изучения]

1. [Наследование и полиморфмизм в C++](https://education.yandex.ru/handbook/cpp/article/inheritance-and-polymorphism)
   :::
