OVH Cloud OVH Cloud

heritage multiple

4 réponses
Avatar
Rage
Bonjour à tous,

Je viens de lire sur une faq c++ que lorsque 2 classes (class1 et
class2) virtuelles héritent d'une classe mère avec 2 fonctions (foo() et
bar()), que class1 implemente foo() et class2 implemente bar(),
alors si class1 apelle la fonction bar(), la fonction appellée sera
celle de class2.

Cela me semble bizarre etant donné que les class1 et 2 n'ont aucun
rapport entre elles.
Quelqu'un peut il confirmer?

si je suis pas clair, la version d'iorigine est ici :
http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.10

d'autre part, si ceci fonctionne, que ce passe t'il si 3 classes
virtuelles héritent de la classe mère?
Si la fonction bar() est implémenté dans les class2 et 3 par exemple,
laquelle sera appelée si class1 appelle cette fonction?

Merci

Rage

4 réponses

Avatar
Jean-Marc Bourguet
Rage writes:

Cela me semble bizarre etant donné que les class1 et 2 n'ont aucun
rapport entre elles. Quelqu'un peut il confirmer?


La FAQ est correcte, ta comprehension non. Les classes ont un
rapport: elles heritent virtuellement de la classe de base *et* cet
appel ne se fait que si le type dynamique herite de ces deux classes
(ce qui est le cas dans la FAQ: le type le type dynamique est Join).

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
Rage
Jean-Marc Bourguet wrote:

Rage writes:


Cela me semble bizarre etant donné que les class1 et 2 n'ont aucun
rapport entre elles. Quelqu'un peut il confirmer?



La FAQ est correcte, ta comprehension non. Les classes ont un
rapport: elles heritent virtuellement de la classe de base *et* cet
appel ne se fait que si le type dynamique herite de ces deux classes
(ce qui est le cas dans la FAQ: le type le type dynamique est Join).

A+




ouaip, merci.

mais j'ai toujours du mal avec l'héritage multiple.
Si la class Join hérite de 3 classes, que 2 d'entre elles définissent la
fonction Bar() et qu'on souhaite appeller cette fonction.
Alors la classe Join doit utiliser un truc du type class2::bar(), ca
marche pas autrement, c ca?

merci

Rage


Avatar
Jean-Marc Bourguet
Rage writes:

Si la class Join hérite de 3 classes, que 2 d'entre elles
définissent la fonction Bar() et qu'on souhaite appeller cette
fonction. Alors la classe Join doit utiliser un truc du type
class2::bar(), ca marche pas autrement, c ca?


Oui.

--
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
Geoffrey BAUDIN
Arf, sa tombe bien c exactement le probleme sur lequel je tombe ...
je resume un peu par rapport a mon pb pour etre sur d'avoir bien compris ce
qui se passe ...

si g une classe de Base A et B

class A
{
virtual Funct1() = 0;
virtual toto() = 0;
}

class B
{
virtual Funct2() = 0;
virtual toto() = 0;
}

je peux donc faire une classe C

class C : public A, public B
{
virtual Funct1();
virtual Funct2();
virtual toto();
}

si je fais un truc comme ca :

C *p = new C();
A *p1 = p;
B *p2 = p;

p1->Funct1 ; // m'execute le code de la fonction C::Funct1() ??
p2->Funct2; // m'execute le code de la fonction C::Funct2() ??

Que se passe t'il pour la function toto() ??
Faut il donc si g pas trop mal lu la FAQ en question faire

class D
{
virtual toto() = 0;
}

class A : public virtual D
{
virtual Funct1() = 0;
virtual toto() = 0; // peut on a ce niveau-ci ne pas definir de
corps pour toto() ??
}

class B : public virtual D
{
virtual Funct2() = 0;
virtual toto() = 0;
}

class C : public A, public B
{
virtual Funct1();
virtual Funct2();
virtual toto();
}


merci, c pas encore bien bien clair ce truc dans mon esprit ...

"Jean-Marc Bourguet" a écrit dans le message de
news:
Rage writes:

Si la class Join hérite de 3 classes, que 2 d'entre elles
définissent la fonction Bar() et qu'on souhaite appeller cette
fonction. Alors la classe Join doit utiliser un truc du type
class2::bar(), ca marche pas autrement, c ca?


Oui.

--
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