Mostenirea implica regulile cunoscute din orice carte care trateaza limbajul C++:
- in cazul mostenirii publice, membrii publici si
protected mosteniti in clasa derivata isi pastreaza nivelul de acces iar
membrii privati sunt inaccesibili altfel decat prin intermediul eventualelor metode
publice din clasa de baza;
- in cazul mostenirii protected, membrii publici si
protected ai clasei de baza devin protected in clasa derivata, cei privati
fiind inaccesibili cu observatia anterioara;
- in cazul mostenirii private, membrii publici si
protected devin privati.
Daca avem urmatoarea situatie de mostenire multipla,
class X
{ public: char i;};
class Y
{ public: float i;};
class Z : public X, public Y
{
public:
long i;
};
ce se va initializa la succesiunea
….
z zed;
zed.i = 500;
….
?
Sau, in alte cuvinte, compilatorul va furniza warning la atribuirea zed.i = 18.21?
Raspunsul este ca se va initializa membrul i cu tipul long. Iar in cazul atribuirii constantei float se va semnala warning, din cauza conversiei float-->long.
Pentru initializarea
celorlalti membri mosteniti din clasele de baza X si Y trebuie folositi fie
operatorul domeniu de rezolutie pentru a-i adresa pe (int) i si (float) i via
clasele de baza X si Y, fie pointeri la clasele de baza initializati cu adresa
lui zed - asta, intrucat tipul derivat are si tipul clasei de baza (nu invers!)
In exemplul urmator se vor ilustra ambele variante.
#include <iostream>
using namespace std;
class X {
public:
char i;
};
class Y {
public:
float i;
};
class Z : public Y, public X
{
public:
long i;
};
int main()
{
Z zed;
X * ptr =
&zed;
Y * ptr1 =
&zed;
zed.Y::i =
3.14;
zed.X::i = 'a';
zed.i = 1000;
cout <<
"\nInitializarile membrilor mosteniti din clasele de baza folosind numele
complet:\n";
cout <<"\ni = " <<
zed.Y::i << "\ni = " << zed.X::i << "\ni =
" << zed.i <<"\n";
ptr->i =
'b';
ptr1->i =
2.71;
zed.i = 100;
cout <<
"\nInitializarile membrilor mosteniti folosind pointeri la clasele de
baza:\n";
cout
<<"\ni = " << zed.Y::i << "\ni = "
<< zed.X::i << "\ni = " << zed.i;
return 0;
}
No comments:
Post a Comment