OVH Cloud OVH Cloud

héritage et instance

2 réponses
Avatar
ccppc400
Bonjour,

Supposons que :
1- J'ai une class A virtuelle pure (+ non derivable)
2- Une class B, avec un pattern singleton.

Je derive une class C comme suit :
class C : public class B, bublic class A
{
.=2E....
//methodes de la class A
.=2E....

A* m_interface;
}


ma question est :
Le restant de l'application n'etant pas au courant de la structure de
l'objet C, qui d'ailleure peut varie. Je veux garantir l'acces a un
certain nombre de methodes (c-a-d ceux de la class A), ainsi je dois
transmettre un pointeur de mon interface A.
Voila, si j'utilise une m=E9thode virtuelle de la class A (A->toto()) je
vais bien appele la methode toto reecrite dans ma class B ? ou faut t
il convertir l'instance de la classe A a B (la convertion pointeur
class mere -> fille est accepte ?

Merci de votre aide.

2 réponses

Avatar
James Kanze
On Feb 26, 8:15 am, wrote:

Supposons que :
1- J'ai une class A virtuelle pure (+ non derivable)


Est-ce que tu veux dire « abstraite » ? Des fonctions peuvent
être virtuelle pure, mais non les classes. Et je ne comprends
pas non-plus le « non derivable » ; si la classe a des
fonctions virtuelles pures, il va bien falloir en dériver pour
s'en servir.

2- Une class B, avec un pattern singleton.

Je derive une class C comme suit :
class C : public class B, bublic class A


Ce qui me semble un peu louche. Comment fais-tu pour dériver
d'une classe singleton (dont le constructeur est normalement
privé) ?

{
......
//methodes de la class A
......

A* m_interface;


On a donc affaire à deux instances des dérivées de la classe A,
d'une part, l'instance de la classe C même, et de l'autre, un
autre objet auquel cette instance pointe.

}

ma question est :
Le restant de l'application n'etant pas au courant de la structure de
l'objet C, qui d'ailleure peut varie. Je veux garantir l'acces a un
certain nombre de methodes (c-a-d ceux de la class A), ainsi je dois
transmettre un pointeur de mon interface A.


Transmettre où ? Tel que c'est décrit ci-dessus, C estUn A ;
un pointeur à C se convertit implicitement en pointeur à A, et
l'utilisateur de C a accès à l'interface A.

Voila, si j'utilise une méthode virtuelle de la class A (A->toto()) je
vais bien appele la methode toto reecrite dans ma class B ?


Encore plus confus : jusqu'ici, je n'ai rien vu qui rapproche A
et B. Donc, une fonction de B ne peut pas supplanter une fonction
de A.

Peut-être ce que tu cherches, c'est une variante du modèle
mix-in :

class B : private virtual A
{
// implémentation de A...
} ;

class C : public virtual A, private B
{
// implémente l'interface d'A au moyen de B...
} ;

Typiquement, ça ne sert que quand tu as plusieurs interfaces, ou
que l'interface se repartit en plusieurs parties, chacune avec
une variété d'implémentations.

ou faut t
il convertir l'instance de la classe A a B (la convertion pointeur
class mere -> fille est accepte ?


Si C hérite publiquement de B, la conversion C* en B* est
implicite et automatique. Mais je ne comprends pas trop ce que
tu essaies réelement à faire.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
ccppc400
J'ai mal redige ma question, je m'ene excuse.

J'ai 3 objets A B C

l'objet "A" étant peu important pour la question, on ne peu avoir
plusieurs instances de cet objet.
Je voudrai garantir une interface unique a tout les modules faisant
appel a "C".
Ainsi, ma class "C" est definie avec des methodes virtuelles comme
suit
class B
{
public:
B();
virtual ~B();

Virtual fct1()=0;
Virtual fct2()=0;
}

l'objet "C"
class C:bublic A, public B
{
...
fct1(); //ecrit dans un fichier txt
fct1(); //lit depuis un fichier txt
...
instaceB1; // instance de la classe mere B

}


l'objet "D"
class C:bublic A, public B
{
...
fct1(); //ecrit dans un fichier ogg
fct1(); //lit depuis un fichier ogg
...
instaceB2; // instance de la classe mere B

}

Le but de B est de garantir une interface unique independament du
fichier de sortie, un objet "E" qu'a besoin d'ecrire dans un fichier
txt recupere une instance
type B* instanceB :
instanceB1->fct1() qui sera interprete comme la fonction d'ecriture
dans un fichier text.
InstanceB2->fct1() qui sera interprete comme la fonction d'ecriture
dans un fichier ogg.
suis je correct dans mon raisonnement ?
Il s'agit ici d'acceder a l'instance des classe "C" et "D" depuis les
instances de leur class mere.