Кратко
- Наследование: Механизм, позволяющий производному классу использовать свойства и методы базового класса.
- Типы наследования:
public
,protected
,private
. - Полиморфизм: Реализуется с помощью виртуальных функций и позволяет переопределять методы базового класса.
- Множественное наследование: Позволяет производному классу наследоваться от нескольких базовых классов.
Подробнее
Наследование — это механизм, который позволяет одному классу (производному или дочернему классу) использовать свойства и методы другого класса (базового или родительского класса). Это основной принцип объектно-ориентированного программирования (ООП), позволяющий создавать иерархии классов и обеспечивать повторное использование кода.
Синтаксис наследования
class Base {
// Базовый класс
};
class Derived : public Base {
// Производный класс, наследующийся от Base
};
Типы наследования (иерархии классов)
- Публичное наследование (
public
): Всеpublic
иprotected
члены базового класса остаютсяpublic
иprotected
в производном классе. - Защищенное наследование (
protected
): Всеpublic
иprotected
члены базового класса становятсяprotected
в производном классе. - Приватное наследование (
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;
}