C++ pour les programmeurs C by Claude Delannoy

C++ pour les programmeurs C by Claude Delannoy

Auteur:Claude Delannoy [Delannoy, Claude]
La langue: fra
Format: epub
Tags: Informatique
Éditeur: O'Reilly
Publié: 2007-09-04T08:59:46+00:00


L’héritage simple

274

CHAPITRE 13

On notera bien que si l’opérateur = a été surdéfini sous forme privée dans A, son appel ne

pourra pas se faire pour un objet de type B (en dehors des fonctions membres de B). L’inter-

diction de l’af ectation dans A entraîne donc, d’office, celle de l’affectation dans B.

On retrouve un comportement tout à fait analogue à celui décrit dans le cas du constructeur

de recopie.

8.2 La classe dérivée surdéfinit l'opérateur =

L'affectation de deux objets de type B fera alors nécessairement appel à l'opérateur = défini

dans B. Celui de A ne sera pas appelé, même s'il a été surdéfini. Il faudra donc que l'opéra-

teur = de B prenne en charge tout ce qui concerne l'affectation d'objets de type B, y

compris pour ce qui est des membres hérités de A.

Voici un premier exemple de programme illustrant cela : la classe pointcol dérive de point.

Les deux classes ont surdéfini l'opérateur = :

#include <iostream>

using namespace std ;

class point

{ protected :

int x, y ;

public :

point (int abs=0, int ord=0) { x=abs ; y=ord ;}

point & operator = (point & a)

{ x = a.x ; y = a.y ;

cout << "operateur = de point \n" ;

return * this ;

}

} ;

class pointcol : public point

{ protected :

int coul ;

public :

pointcol (int abs=0, int ord=0, int cl=1) : point (abs, ord) { coul=cl ; }

pointcol & operator = (pointcol & b)

{ coul = b.coul ;

cout << "operateur = de pointcol\n" ;

return * this ;

}

void affiche ()

{ cout << "pointcol : " << x << " " << y << " " << coul << "\n" ;

}

} ;

main()

{ pointcol p(1, 3, 10) , q(4, 9, 20) ;

cout << "p = " ; p.affiche () ;

cout << "q avant = " ; q.affiche () ;

q = p ;

cout << "q apres = " ; q.affiche () ;

}

8 - L’opérateur d’affectation et l’héritage

275

p = pointcol : 1 3 10

q avant = pointcol : 4 9 20

operateur = de pointcol

q apres = pointcol : 4 9 10

Quand la classe de base et la classe dérivée surdéfinissent l'opérateur =

On voit clairement que l'opérateur = défini dans la classe point n'a pas été appelé lors d'une

affectation entre objets de type pointcol.

Le problème est voisin de celui rencontré à propos du constructeur de recopie, avec cette dif-

férence qu'on ne dispose plus ici du mécanisme de transfert d’arguments qui en permettait un

appel (presque) implicite. Si l'on veut pouvoir profiter de l'opérateur = défini dans A, il fau-

dra l'appeler explicitement. Le plus simple pour ce faire est d'utiliser les possibilités de con-

versions de pointeurs examinées au paragraphe précédent.

Voici comment nous pourrions modifier en ce sens l'opérateur = de pointcol :

pointcol & operator = (pointcol & b)

{ point * ad1, * ad2 ;

cout << "opérateur = de pointcol\n" ;

ad1 = this ; // conversion pointeur sur pointcol en pointeur sur point

ad2 = & b ; // idem

* ad1 = * ad2 ; // affectation de la "partie point" de b

coul = b.coul ; // affectation de la partie propre à pointcol

return * this ;

}

Nous convertissons les pointeurs (this et &b) sur des objets de pointcol en des pointeurs sur

des objets de type point.



Télécharger



Déni de responsabilité:
Ce site ne stocke aucun fichier sur son serveur. Nous ne faisons qu'indexer et lier au contenu fourni par d'autres sites. Veuillez contacter les fournisseurs de contenu pour supprimer le contenu des droits d'auteur, le cas échéant, et nous envoyer un courrier électronique. Nous supprimerons immédiatement les liens ou contenus pertinents.