Кратко

  • Наследование: Механизм, позволяющий производному классу использовать свойства и методы базового класса.
  • Типы наследования: public, protected, private.
  • Полиморфизм: Реализуется с помощью виртуальных функций и позволяет переопределять методы базового класса.
  • Множественное наследование: Позволяет производному классу наследоваться от нескольких базовых классов.

Подробнее

Наследование — это механизм, который позволяет одному классу (производному или дочернему классу) использовать свойства и методы другого класса (базового или родительского класса). Это основной принцип объектно-ориентированного программирования (ООП), позволяющий создавать иерархии классов и обеспечивать повторное использование кода.

Синтаксис наследования

class Base {
    // Базовый класс
};
 
class Derived : public Base {
    // Производный класс, наследующийся от Base
};

Типы наследования (иерархии классов)

  1. Публичное наследование (public): Все public и protected члены базового класса остаются public и protected в производном классе.
  2. Защищенное наследование (protected): Все public и protected члены базового класса становятся protected в производном классе.
  3. Приватное наследование (private): Все public и protected члены базового класса становятся private в производном классе.

Пример публичного наследования

#include <iostream>
 
class Base {
public:
    void baseFunction() {
        std::cout << "Base function" << std::endl;
    }
};
 
class Derived : public Base {
public:
    void derivedFunction() {
        std::cout << "Derived function" << std::endl;
    }
};
 
int main() {
    Derived obj;
    obj.baseFunction(); // Доступен метод базового класса
    obj.derivedFunction(); // Доступен метод производного класса
    return 0;
}

Пример защищенного наследования

#include <iostream>
 
class Base {
public:
    void baseFunction() {
        std::cout << "Base function" << std::endl;
    }
};
 
class Derived : protected Base {
public:
    void derivedFunction() {
        std::cout << "Derived function" << std::endl;
        baseFunction(); // Доступен внутри производного класса
    }
};
 
int main() {
    Derived obj;
    // obj.baseFunction(); // Ошибка: метод недоступен извне
    obj.derivedFunction(); // Доступен метод производного класса
    return 0;
}

Пример приватного наследования

#include <iostream>
 
class Base {
public:
    void baseFunction() {
        std::cout << "Base function" << std::endl;
    }
};
 
class Derived : private Base {
public:
    void derivedFunction() {
        std::cout << "Derived function" << std::endl;
        baseFunction(); // Доступен внутри производного класса
    }
};
 
int main() {
    Derived obj;
    // obj.baseFunction(); // Ошибка: метод недоступен извне
    obj.derivedFunction(); // Доступен метод производного класса
    return 0;
}

Виртуальные функции и полиморфизм

Виртуальные функции позволяют переопределять методы базового класса в производных классах, обеспечивая полиморфизм.

#include <iostream>
 
class Base {
public:
    virtual void show() {
        std::cout << "Base class" << std::endl;
    }
};
 
class Derived : public Base {
public:
    void show() override {
        std::cout << "Derived class" << std::endl;
    }
};
 
void display(Base& obj) {
    obj.show(); // Вызов переопределенного метода
}
 
int main() {
    Base b;
    Derived d;
 
    display(b); // Вывод: Base class
    display(d); // Вывод: Derived class
 
    return 0;
}

Множественное наследование

C++ поддерживает множественное наследование, когда производный класс наследуется от нескольких базовых классов.

#include <iostream>
 
class Base1 {
public:
    void base1Function() {
        std::cout << "Base1 function" << std::endl;
    }
};
 
class Base2 {
public:
    void base2Function() {
        std::cout << "Base2 function" << std::endl;
    }
};
 
class Derived : public Base1, public Base2 {
public:
    void derivedFunction() {
        std::cout << "Derived function" << std::endl;
    }
};
 
int main() {
    Derived obj;
    obj.base1Function();
    obj.base2Function();
    obj.derivedFunction();
    return 0;
}