C++ Openbare, beschermde en privé-erfenis
C++ openbare, beschermde en privé-erfenis
In deze tutorial leren we met behulp van voorbeelden openbare, beschermde en private overerving in C++ te gebruiken.
In C++-overerving kunnen we een onderliggende klasse afleiden van de basisklasse in verschillende toegangsmodi. Bijvoorbeeld,
class Base {
.... ... ....
};
class Derived : public Base {
.... ... ....
};
Let op het trefwoord public
in de code
class Derived : public Base
Dit betekent dat we een afgeleide klasse hebben gemaakt van de basisklasse in openbare modus . Als alternatief kunnen we ook klassen afleiden in protected of privé modi.
Deze 3 trefwoorden (public
, protected
, en private
) staan bekend als toegangsspecificaties in C++ overerving.
openbare, beschermde en privé overerving in C++
openbaar , beschermd, en privé overerving hebben de volgende kenmerken:
- publieke erfenis maakt
public
leden van de basisklassepublic
in de afgeleide klasse, en deprotected
leden van de basisklasse blijvenprotected
in de afgeleide klasse. - beschermde erfenis maakt de
public
enprotected
leden van de basisklasseprotected
in de afgeleide klasse. - private erfenis maakt de
public
enprotected
leden van de basisklasseprivate
in de afgeleide klasse.
Opmerking: private
leden van de basisklasse zijn niet toegankelijk voor de afgeleide klasse.
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
}
Voorbeeld 1:C++ openbare erfenis
// 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;
}
Uitvoer
Private = 1 Protected = 2 Public = 3
Hier hebben we PublicDerived
. afgeleid van Base
in openbare modus .
Als resultaat, in PublicDerived
:
- prot wordt geërfd als beschermd .
- kroeg en
getPVT()
worden geërfd als openbaar . - pvt is ontoegankelijk omdat het privé is in
Base
.
Sinds privé en beschermd leden zijn niet toegankelijk vanaf main()
, we moeten openbare functies maken getPVT()
en getProt()
om ze te openen:
// Error: member "Base::pvt" is inaccessible
cout << "Private = " << object1.pvt;
// Error: member "Base::prot" is inaccessible
cout << "Protected = " << object1.prot;
Merk op dat de getPVT()
functie is gedefinieerd binnen Base
. Maar de getProt()
functie is gedefinieerd binnen PublicDerived
.
Dit komt omdat pvt , dat is privé in Base
, is niet toegankelijk voor PublicDerived
.
Echter, prot is toegankelijk voor PublicDerived
wegens openbare erfenis. Dus getProt()
heeft toegang tot de beveiligde variabele vanuit PublicDerived
.
Toegankelijkheid in openbare erfenis
Toegankelijkheid | privéleden | beschermde leden | openbare leden |
---|---|---|---|
Basisklasse | Ja | Ja | Ja |
Afgeleide klasse | Nee | Ja | Ja |
Voorbeeld 2:C++ beschermde overerving
// 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;
}
Uitgang
Private cannot be accessed. Protected = 2 Public = 3
Hier hebben we ProtectedDerived
. afgeleid van Base
in beveiligde modus .
Als resultaat, in ProtectedDerived
:
- prot , kroeg en
getPVT()
worden geërfd als beschermd . pvt
is ontoegankelijk omdat het privé is inBase
.
Zoals we weten, beschermd leden zijn niet rechtstreeks toegankelijk van buiten de klas. Als gevolg hiervan kunnen we getPVT()
. niet gebruiken van ProtectedDerived
.
Dat is ook de reden waarom we de getPub()
. moeten maken functie in ProtectedDerived
om toegang te krijgen tot de pub variabel.
// Error: member "Base::getPVT()" is inaccessible
cout << "Private = " << object1.getPVT();
// Error: member "Base::pub" is inaccessible
cout << "Public = " << object1.pub;
Toegankelijkheid in beschermde erfenis
Toegankelijkheid | privéleden | beschermde leden | openbare leden |
---|---|---|---|
Basisklasse | Ja | Ja | Ja |
Afgeleide klasse | Nee | Ja | Ja (overgenomen als beveiligde variabelen) |
Voorbeeld 3:C++ privé-erfenis
// 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;
}
Uitvoer
Private cannot be accessed. Protected = 2 Public = 3
Hier hebben we PrivateDerived
. afgeleid van Base
in privémodus .
Als resultaat, in PrivateDerived
:
- prot ,
pub
engetPVT()
worden geërfd als privé . - pvt is ontoegankelijk omdat het privé is in
Base
.
Zoals we weten, zijn privéleden niet rechtstreeks toegankelijk van buiten de klas. Als gevolg hiervan kunnen we getPVT()
. niet gebruiken van PrivateDerived
.
Dat is ook de reden waarom we de getPub()
. moeten maken functie in PrivateDerived
om toegang te krijgen tot de pub variabel.
// Error: member "Base::getPVT()" is inaccessible
cout << "Private = " << object1.getPVT();
// Error: member "Base::pub" is inaccessible
cout << "Public = " << object1.pub;
Toegankelijkheid in privé-erfenis
Toegankelijkheid | privéleden | beschermde leden | openbare leden |
---|---|---|---|
Basisklasse | Ja | Ja | Ja |
Afgeleide klasse | Nee | Ja (overgenomen als privévariabelen) | Ja (overgenomen als privévariabelen) |
C Taal
- Publieke cloud versus privécloud versus hybride cloud
- Voor- en nadelen van de openbare cloud
- Private Cloud voordelen en nadelen
- C++ variabelen, literalen en constanten
- C++ klassen en objecten
- C++ Geheugenbeheer:nieuw en verwijderen
- C++ vriend Functie en vriend Klassen
- Structuren en klassen in C++
- Private area network bouwt voort op het openbare Sigfox-netwerk
- Operators in C++ met voorbeeld:wat is, typen en programma's
- Verschil tussen structuur en klasse:uitgelegd met C++-voorbeeld