7.5. Atribuirea obiectelor de la clasa derivat? la clasa de baz?

7.5. Atribuirea obiectelor de la clasa derivat? la clasa de baz?

La atribuirea obiectelor prin operatorul de atribuire implicit, c?t ?i prin unul supra?nc?rcat, exist? urm?toarea lege:

Se admite orice atribuire a obiectului de baz? oric?rui obiect derivat (nu depinde de genera?ie). Unica excep?ie, c?nd operatorul de atribuire a fost supra?nc?rcat ?n clasa de baz? ca membru privat.Atribuirea invers?, adic? a obiectului derivat unui obiect de baz?, nu este permis?.

Direc?ia admis? de atribuire ?n regula dat? este foarte u?or de ?n?eles. Obiectul care se atribuie trebuie s? fie ?n stare s? completeze toate c?mpurile obiectului c?ruia i se atribuie. La mo?tenire, clasa derivat? mo?tene?te toate c?mpurile str?mo?ilor s?i ?i, deci, ea este ?n stare s? completeze c?mpurile oric?rui str?mo? la atribuire.

?n clasa derivat? poate s? apar? c?mpuri noi, care nu existau la str?mo?ii s?i ?i pe care nici un str?mo? nu va fi ?n stare s? le completeze, de aceea direc?ia de atribuire de la str?mo? spre un derivat este interzis?. Urm?torul fragment, care trebuie de ad?ugat la func?ia main(), demonstreaz? cele spuse:

fractie_rationala f1, f2;
   f1=a;  // atribuirea de la rational_fara_semn la
          // fractie_rationala
   f2=r1; // atribuirea de la rational la
          // fractie_rationala
   b=r1;  // atribuirea de la rational la
          // rational_fara_semn
   cout << "f1=" << f1 << endl;
   cout << "f2=" << f2 << endl;
   cout << "b=" << b << endl;

El va afi?a urm?toarea ie?ire:

f1=1/3
f2=3/7
b=1,3/7

Urm?toarele atribuiri sunt interzise ?i nu vor fi compilate:

a=f1;
r1=f2;
r1=b;

Direc?ia de atribuire admis? ?ntre pointeri spre clase de baz? ?i spre cele derivate este aceea?i ca ?i pentru obiecte:

Este admis? atribuirea pointerului spre o clas? de baz? a adresei oric?rui obiect al clasei derivate sau a valorii pointerului spre obiectele claselor derivate (nu depinde de tipul mo?tenirii: nemijlocit? sau prin alte clase).Atribuirea invers?, adic? atribuirea pointerului spre o clas? derivat? a adresei unui obiect al clasei de baz? sau a valorii unui alt pointer spre o clas? de baz?, nu se admite.

Deci, direc?ia admis? de atribuire este de la pointeri cu tipul adresa clasei derivate (?n orice genera?ie) spre pointer cu tipul adresa clasei de baz?. Pentru exemplu, cercet?m urm?torul fragment, pe care ?l ad?ug?m la func?ia main():

fractie_rationala *p;
   rational_fara_semn *q;
   rational *t;
 
   p=&a; // pointerului spre fractie_rationala se atribuie
         // adresa unui rational_fara_semn
   cout << "*p=" << *p << endl; 
   q=&b;
   p=q; // pointerului spre fractie_rationala se atribuie un
        // pointer spre rational_fara_semn
   cout << "*p=" << *p << endl;
 
   p=&r1; // pointerului spre fractie_rationala – adresa
          // unui rational
   cout << "*p=" << *p << endl;
   t=&r2;
   p=t; // pointerului spre fractie_rationala – pointer spre
        // rational
   cout << "*p=" << *p << endl;
 
   q=&r1; // pointerului spre rational_fara_semn – adresa
          // unui rational
   cout << "*q=" << *q << endl;
   t=&r2;
   q=t; // pointerului spre rational_fara_semn – pointer spre
        // rational
   cout << "*q=" << *q << endl;

Atribuirile care ne intereseaz? ?n acest fragment sunt comentate. Fragmentul ad?ugat va afi?a:

*p=1/3
*p=3/7
*p=3/7
*p=1/3
*q=1,3/7
*q=2,1/3

Aceste rezultate sunt clare. Totu?i, se cere o observa?ie ?n compara?ie cu rezultatele din exemplul precedent. C?nd atribuim obiectului f1 obiectul a cu valoarea 2,1/3, f1 devine 1/3, expresia cout << f1 afi?eaz? 1/3, ceea ce este corect.

C?nd pointerului p cu tipul de baz? fractie_rationala ?i atribuim &a, el ob?ine adresa obiectului a, deci, pointeaz? un obiect rational_fara_semn cu valoarea 2,1/3, iar expresia cout << p totuna va afi?a 1/3, ceea ce nu este corect. Vom am?na discutarea acestei probleme p?n? la cercetarea func?iilor virtuale.

Urm?toarele atribuiri sunt interzise ?i nu vor fi compilate:

q=&f1;
q=p;
t=&f1;
t=p;
t=&a;
t=q;

_________________________
Autorul: dr.conf. S. Pereteatcu

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов