Публичное, защищенное и частное наследование C++
Общедоступное, защищенное и частное наследование C++
В этом руководстве мы научимся использовать открытое, защищенное и закрытое наследование в C++ с помощью примеров.
При наследовании C++ мы можем наследовать дочерний класс от базового класса в различных режимах доступа. Например,
class Base {
.... ... ....
};
class Derived : public Base {
.... ... ....
};
Обратите внимание на ключевое слово public
. в коде
class Derived : public Base
Это означает, что мы создали производный класс от базового класса в общедоступном режиме. . В качестве альтернативы мы также можем получить классы из защищенных или частное режимы.
Эти 3 ключевых слова (public
, protected
и private
) известны как спецификаторы доступа. в наследовании C++.
открытое, защищенное и закрытое наследование в C++
общедоступно , защищено и частное наследование имеет следующие особенности:
- открытое наследование составляет
public
члены базового классаpublic
в производном классе, аprotected
члены базового класса остаютсяprotected
в производном классе. - защищенное наследование делает
public
иprotected
члены базового классаprotected
в производном классе. - частное наследование делает
public
иprotected
члены базового классаprivate
в производном классе.
Примечание. private
члены базового класса недоступны для производного класса.
class Base {
public:
int x;
protected:
int y;
private:
int z;
};
class PublicDerived: public Base {
// x is public
// y is protected
// z is not accessible from PublicDerived
};
class ProtectedDerived: protected Base {
// x is protected
// y is protected
// z is not accessible from ProtectedDerived
};
class PrivateDerived: private Base {
// x is private
// y is private
// z is not accessible from PrivateDerived
}
<час> Пример 1:общедоступное наследование C++
// C++ program to demonstrate the working of public inheritance
#include <iostream>
using namespace std;
class Base {
private:
int pvt = 1;
protected:
int prot = 2;
public:
int pub = 3;
// function to access private member
int getPVT() {
return pvt;
}
};
class PublicDerived : public Base {
public:
// function to access protected member from Base
int getProt() {
return prot;
}
};
int main() {
PublicDerived object1;
cout << "Private = " << object1.getPVT() << endl;
cout << "Protected = " << object1.getProt() << endl;
cout << "Public = " << object1.pub << endl;
return 0;
}
Вывод
Private = 1 Protected = 2 Public = 3
Здесь мы получили PublicDerived
из Base
в общедоступном режиме .
В результате в PublicDerived
:
- защита наследуется как защищенный .
- паб и
getPVT()
наследуются как общедоступные . - частное недоступен, так как он частный в
Base
.
Поскольку частное и защищено члены недоступны из main()
, нам нужно создать публичные функции getPVT()
и getProt()
чтобы получить к ним доступ:
// Error: member "Base::pvt" is inaccessible
cout << "Private = " << object1.pvt;
// Error: member "Base::prot" is inaccessible
cout << "Protected = " << object1.prot;
Обратите внимание, что getPVT()
функция была определена внутри Base
. Но getProt()
функция была определена внутри PublicDerived
.
Это потому, что pvt , который является личным в Base
, недоступен для PublicDerived
.
Однако защита доступен для PublicDerived
из-за публичного наследования. Итак, getProt()
может получить доступ к защищенной переменной из PublicDerived
.
Доступность в публичном наследовании
Специальные возможности | частные участники | защищенные участники | общедоступные члены |
---|---|---|---|
Базовый класс | Да | Да | Да |
Производный класс | Нет | Да | Да |
Пример 2:защищенное наследование C++
// C++ program to demonstrate the working of protected inheritance
#include <iostream>
using namespace std;
class Base {
private:
int pvt = 1;
protected:
int prot = 2;
public:
int pub = 3;
// function to access private member
int getPVT() {
return pvt;
}
};
class ProtectedDerived : protected Base {
public:
// function to access protected member from Base
int getProt() {
return prot;
}
// function to access public member from Base
int getPub() {
return pub;
}
};
int main() {
ProtectedDerived object1;
cout << "Private cannot be accessed." << endl;
cout << "Protected = " << object1.getProt() << endl;
cout << "Public = " << object1.getPub() << endl;
return 0;
}
Вывод
Private cannot be accessed. Protected = 2 Public = 3
Здесь мы получили ProtectedDerived
из Base
в защищенном режиме .
В результате в ProtectedDerived
:
- защита , паб и
getPVT()
наследуются как защищенные . pvt
недоступен, так как он частный вBase
.
Как известно, защищено доступ к участникам невозможен напрямую извне класса. В результате мы не можем использовать getPVT()
из ProtectedDerived
.
Вот почему нам нужно создать getPub()
функция в ProtectedDerived
чтобы получить доступ к пабу переменная.
// Error: member "Base::getPVT()" is inaccessible
cout << "Private = " << object1.getPVT();
// Error: member "Base::pub" is inaccessible
cout << "Public = " << object1.pub;
<час> Доступность в защищенном наследовании
Специальные возможности | частные участники | защищенные участники | общедоступные члены |
---|---|---|---|
Базовый класс | Да | Да | Да |
Производный класс | Нет | Да | Да (наследуется как защищенные переменные) |
Пример 3:частное наследование C++
// C++ program to demonstrate the working of private inheritance
#include <iostream>
using namespace std;
class Base {
private:
int pvt = 1;
protected:
int prot = 2;
public:
int pub = 3;
// function to access private member
int getPVT() {
return pvt;
}
};
class PrivateDerived : private Base {
public:
// function to access protected member from Base
int getProt() {
return prot;
}
// function to access private member
int getPub() {
return pub;
}
};
int main() {
PrivateDerived object1;
cout << "Private cannot be accessed." << endl;
cout << "Protected = " << object1.getProt() << endl;
cout << "Public = " << object1.getPub() << endl;
return 0;
}
Вывод
Private cannot be accessed. Protected = 2 Public = 3
Здесь мы получили PrivateDerived
из Base
в приватном режиме .
В результате в PrivateDerived
:
- защита ,
pub
иgetPVT()
наследуются как частные . - частное недоступен, так как он частный в
Base
.
Как мы знаем, закрытые члены не могут быть доступны напрямую извне класса. В результате мы не можем использовать getPVT()
из PrivateDerived
.
Именно поэтому нам нужно создать getPub()
функция в PrivateDerived
чтобы получить доступ к пабу переменная.
// Error: member "Base::getPVT()" is inaccessible
cout << "Private = " << object1.getPVT();
// Error: member "Base::pub" is inaccessible
cout << "Public = " << object1.pub;
<час> Доступность в частном наследовании
Специальные возможности | частные участники | защищенные участники | общедоступные члены |
---|---|---|---|
Базовый класс | Да | Да | Да |
Производный класс | Нет | Да (наследуется как частные переменные) | Да (наследуется как частные переменные) |
Язык C
- Общедоступное облако против частного облака против гибридного облака
- Преимущества и недостатки общедоступного облака
- Преимущества и недостатки частного облака
- Переменные C++, литералы и константы
- Классы и объекты С++
- Управление памятью C++:создание и удаление
- Дружественные функции C++ и дружественные классы
- Структуры и классы в C ++
- Частная сеть строится на основе общедоступной сети Sigfox
- Разница между структурой и классом:объяснение на примере C++