OVH Cloud OVH Cloud

Protected, je ne vois pas

4 réponses
Avatar
Azuriel
Soit les deux classes suivantes :

class A
{
public:
virtual ~A() {}
protected:
virtual void toto() = 0;
};

class B : public A
{
public:
virtual ~B() {}

void func()
{
A &a = *this;
a.toto();
}

protected:
void toto() {}
};

Pourquoi gcc me renvoie-t'il "error: ‘virtual void A::toto()’ is
protected" à la ligne "a.toto();" ?
Pourtant toto() est déclarée en protected, je ne vois pas le soucis.

Merci.

4 réponses

Avatar
Jean-Marc Bourguet
Azuriel writes:

Pourquoi gcc me renvoie-t'il "error: virtual void A::toto() is
protected" à la ligne "a.toto();" ? Pourtant toto() est déclarée en
protected, je ne vois pas le soucis.


On ne peut appeler un membre protected dans une classe que si l'objet sur
lequel on appelle le membre a pour type statique la classe ou un de ses
descendants.

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
Azuriel
Azuriel writes:

Pourquoi gcc me renvoie-t'il "error: virtual void A::toto() is
protected" à la ligne "a.toto();" ? Pourtant toto() est déclarée en
protected, je ne vois pas le soucis.


On ne peut appeler un membre protected dans une classe que si l'objet sur
lequel on appelle le membre a pour type statique la classe ou un de ses
descendants.

A+



Ok, je comprends, merci, mais je n'arrive pas à trouver ça cohérent du
point du vue du paradigme objet.
Vous pouvez éclairer ma lanterne ?


Avatar
Michael DOUBEZ
Azuriel writes:

Pourquoi gcc me renvoie-t'il "error: virtual void A::toto() is
protected" à la ligne "a.toto();" ? Pourtant toto() est déclarée en
protected, je ne vois pas le soucis.


On ne peut appeler un membre protected dans une classe que si l'objet sur
lequel on appelle le membre a pour type statique la classe ou un de ses
descendants.


Pour être totalement correct, c'est aussi possible d'appeler un membre
protected à partir d'une class friend.

Michael


Avatar
alexandre
Ok, je comprends, merci, mais je n'arrive pas à trouver ça cohérent du
point du vue du paradigme objet.
Vous pouvez éclairer ma lanterne ?


protected est une sorte de "private" mais autorisant un accès pour les
héritiers. Dans ton cas, la fonction est globale (donc ni membre ni membre
d'une héritière) et donc un membre "protected" est inaccessible. C'est tout
à fait cohérent : le principe de base est l'encaspulation, ie la séparation
de l'interface (ce qui est public) avec l'implémentation (ce qui est privé).
La notino de protégé rend l'implémentation modifiable & utilisable dans
l'héritage, c'est tout.