7.9. Mo?tenire multipl?

7.9. Mo?tenire multipl?

C++ admite a?a-numita mo?tenire multipl? (engl. multiple inheritance) c?nd o clas? derivat? mo?tene?te de la dou? sau mai multe clase de baz? diferite. ?n acest caz, forma general? de defini?ie a unei clase derivate este urm?toarea:

class nume_clas?_derivat?:[mod_mo?tenire] nume_clas?_de_baz?_1,[mod_mo?tenire] nume_clas?_de_baz?_2,…

[mod_mo?tenire] nume_clas?_de_baz?_m

{

// codul de definire a clasei

   …

};

Toate clasele de baz? trebuie s? fie diferite. Ordinea claselor de baz? conteaz?, fiindc? anume ?n aceast? ordine vor fi plasate ?n obiectul derivat c?mpurile mo?tenite de la clasele de baz?. Tot ?n aceast? ordine vor fi apela?i ?i constructorii claselor de baz? ?n constructorul clasei derivate, ?nainte de a fi executat ?nsu?i codul constructorului clasei derivate.

Ordinea apelurilor destructorilor claselor de baz? ?n destructorul clasei derivate va fi invers? ?i aceste apeluri vor fi realizate dup? executarea codului ?nsu?i al destructorului clasei derivate.

Forma general? de definire ?i supra?nc?rcare a constructorului clasei derivate ?n cazul mo?tenirii multiple arat? astfel:

[nume_clas?_derivat?::]nume_clas?_derivat?(list?_parametri)

[:nume_clas?_baz?_1(list?_argumente),

nume_clas?_baz?_2(list?_argumente),

      …

nume_clas?_baz?_m(list?_argumente)

]

{

//codul constructorului derivat

   …

}

Aici ordinea de scriere a apelurilor constructorilor de baz? nu are importan??; oricum, constructorii vor fi apela?i conform ordinii stabilite ?n defini?ia clasei derivate. Apelurile explicite ale constructorilor de baz? f?r? argumente pot fi omise (toate, sau o parte din ele); ?n a?a caz, ele vor fi generate implicit de c?tre compilator.

Pentru exemplu de mo?tenire multipl? vom alege domeniul de modelare geometric? ?n plan cu punctele av?nd coordonate ra?ionale.

?n baza clasei rational vom crea dou? clase separate, pentru descrierea specificului coordonatelor, respectiv x ?i y. Deci, inser?m ?n programul exemplului nostru, dup? declararea clasei rational, urm?torul cod de declarare a dou? clase sus-men?ionate:

class x_coord: public rational
{
   public:
      x_coord(const rational &x_init) : rational(x_init)
      {
 
      }
 
      rational val()
      {
         return rational(semnul(), part_int, numarat, numit);
      }
};
 
class y_coord: public rational
{
   public:
      y_coord(const rational &y_init) : rational(y_init)
      {
 
      }
 
      rational val()
      {
         return rational(semnul(), part_int, numarat, numit);
      }
};

Ambele clase ?n exemplul nostru sunt practic identice. Ele mo?tenesc de la clasa rational ?i au c?te un constructor ?i c?te o func?ie val(). Constructorii ini?ializeaz? obiectele ob?in?nd prin parametru un obiect ra?ional (valoarea coordonatei respective). Func?iile membre val() ?ntorc informa?iile despre coordonatele respective ?n form? de un obiect rational. ?n practic?, ?n aceste clase pot fi descrise restric?iile care pot fi suprapuse coordonatelor respective. De exemplu, coordonata x poate lua valori numai dintr-un interval anumit etc.

Acum, declar?m o clas? cu mo?tenire multipl?. ?n continuare, codului precedent din exemplul nostru ?i inser?m urm?torul cod:

class punct_2D: public x_coord, public y_coord
{
   public:
      punct_2D(const x_coord &x_init,
               const y_coord &y_init):
         x_coord(x_init),
         y_coord(y_init)
      {
 
      }
 
   friend ostream& operator <<(ostream &stream, punct_2D p)
   {
      cout << "(" << p.x_coord::val() << "; "
                  << p.y_coord::val() << ")";
      return stream;
   }
};

Observ?m c? clasa punct_2D mo?tene?te de la dou? clase x_coord ?i y_coord. Ea are un constructor cu doi parametri (valorile ini?iale pentru coordonatele, respectiv, x ?i y) ?i o supra?nc?rcare a operatorului de inser?ie <<. Re?ine?i cum ?ntr-o clas? ce mo?tene?te multiplu se precizeaz? accesul la un membru mo?tenit. Anume: p.x_coord::val() ?nseamn? apelul func?iei membre val() mo?tenite de la clasa x_coord, iar p.y_coord::val() ?nseamn? apelul func?iei membre val() mo?tenite de la clasa y_coord. Inser?m ?n func?ia main() urm?torul cod de verificare:

punct_2D p1(rational(-2, 1, 3), rational(1, 3, 5));
   cout << "punctul p1 cu coordonate rationale"
        << " este " << p1 << endl;


Rezultatul ob?inut va fi:

punctul p1 cu coordonate rationale este (-2,1/3; 1,3/5)
_________________________
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 сайтов