Tuesday, January 12, 2016

Limbajul C++. Mostenirea de clase si o problema un pic stranie

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