Наследование
Наследование - это механизм объектно-ориентированного
программирования, при котором один класс (наследник)
перенимает поля и методы другого класса (базового).
Базовый класс также называют родительским или суперклассом,
а класс-наследник - производным или подклассом.
При наследовании указывается спецификатор доступа:
public, protected или private,
который определяет, как наследуемые члены будут доступны
в производном классе.
Синтаксис
class Base
{
// члены базового класса
};
class Derived : access Base
{
// члены производного класса
};
Пример
Давайте создадим базовый класс Animal
с методом speak и производный класс
Dog, который наследует этот метод
и добавляет собственный метод fetch:
#include <iostream>
using namespace std;
class Animal
{
public:
void speak()
{
cout << "Some sound" << endl;
}
};
class Dog : public Animal
{
public:
void fetch()
{
cout << "Fetching" << endl;
}
};
int main()
{
Dog dog;
dog.speak();
dog.fetch();
return 0;
}
Результат выполнения кода:
"Some sound"
"Fetching"
Пример
Давайте рассмотрим, как работают спецификаторы
доступа при наследовании. При public-наследовании
публичные члены базового класса остаются публичными,
а при protected-наследовании становятся
защищёнными:
#include <iostream>
using namespace std;
class Base
{
public:
int pub = 1;
protected:
int prot = 2;
};
class PublicDerived : public Base
{
public:
int getProt()
{
return prot;
}
};
class ProtectedDerived : protected Base
{
public:
int getPub()
{
return pub;
}
int getProt()
{
return prot;
}
};
int main()
{
PublicDerived pd;
cout << pd.pub << endl;
cout << pd.getProt() << endl;
ProtectedDerived prd;
cout << prd.getPub() << endl;
cout << prd.getProt() << endl;
return 0;
}
Результат выполнения кода:
1
2
1
2
Пример
Давайте создадим цепочку наследования:
класс A - базовый, класс B
наследует A, а класс C
наследует B. Такой класс C
получит доступ ко всем публичным членам
как B, так и A:
#include <iostream>
using namespace std;
class A
{
public:
void methodA()
{
cout << "A" << endl;
}
};
class B : public A
{
public:
void methodB()
{
cout << "B" << endl;
}
};
class C : public B
{
public:
void methodC()
{
cout << "C" << endl;
}
};
int main()
{
C obj;
obj.methodA();
obj.methodB();
obj.methodC();
return 0;
}
Результат выполнения кода:
"A"
"B"
"C"
Смотрите также
-
ключевое слово
virtual,
которое позволяет переопределять методы в наследниках -
ключевое слово
override,
которое проверяет переопределение виртуального метода -
ключевое слово
protected,
которое задаёт защищённый доступ к членам класса -
множественное наследование
multiple-inheritance,
которое позволяет наследовать от нескольких классов