Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Acces resteint (protected) et const&

2 réponses
Avatar
vicnet
Bonjour,

Le code suivant ne compile pas. Il me mets "D& A::getD() >> est
prot=E9g=E9" alors que le compilo devrait "utiliser" la m=E9thode publique,
non ?

class D {
public:
};

class A {
public:
const D& getD() const { return _d; }
protected:
D& getD() { return _d; }
private:
D _d;
};

void f() {
A* a =3D 0;
const D& d =3D a->getD();
}

Qu'en pensez-vous ? erreur du compilo ou ok pour le c++ ?

J'ai l'impression que la regle de pr=E9dilection de la m=E9thode const (ce
qui est effet mieux la plus part du temps) est syst=E9matique m=EAme si
cela aboutit =E0 une impasse. !?!

Merci

2 réponses

Avatar
Jean-Marc Bourguet
vicnet writes:

Bonjour,

Le code suivant ne compile pas. Il me mets "D& A::getD() >> est
protégé" alors que le compilo devrait "utiliser" la méthode publique,
non ?


Non. Les deux points à savoir:
- le contrôle d'accès est fait *après* résolution de la surcharge.
- les membres const ne sont préférés à leur version non const que quand
l'objet est const, ce qui n'est pas le cas ici (a n'est pas const).

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Fabien LE LEZ
On Mon, 26 Nov 2007 01:41:25 -0800 (PST), vicnet
:

class A {
public:
const D& getD() const { return _d; }
protected:
D& getD() { return _d; }


Attention, "protected" et "private" peuvent empêcher l'accès, mais ne
modifient en rien la visibilité.

(En fait, la règle de base est en gros : si tu as un programme qui
compile, remplacer "protected" et "private" par "public" ne modifiera
en rien son fonctionnement.)

void f() {
A* a = 0;


Ici *a est non-const, donc c'est la fonction membre non-const qui est
appelée.

J'ai l'impression que la regle de prédilection de la méthode const (ce
qui est effet mieux la plus part du temps) est systématique même si
cela aboutit à une impasse. !?!


Je ne suis pas sûr de comprendre ce que tu racontes.
Il faut se représenter une fonction membre comme une fonction qui
prend this en paramètre.

Ainsi, si tu écris :

class A
{
public:
void f() const;
void f();
void g() const;
}

c'est un peu comme écrire :

void f (A const*);
void f (A*);
void g (A const*);

Si tu déclares
A* a;
et que tu appelles f(a), puisque a est un A*, la fonction "f(A*)"
convient directement, et aucune autre fonction n'est candidate.

Si maintenant tu appelles g(a), a ne convient pas directement, donc il
y a conversion implicite en un "A const*", puis g(A const*) est
appelée.