il me semble que le compilo devrait pouvoir trouver la definition de la
methode "methode" via le second heritage....
class VirtualBase{
public:
virtual void methode( void ) = 0;
};
class ConcreteBase{
public:
void methode( void ){
std::cout << " ConcreteBase::methode called" << std::endl;
}
};
class DerivedClass : public VirtualBase, ConcreteBase{
public:
/// Je ne voudrais pas avoir a decommenter la ligne suivante...
////virtual void methode( void ){ ConcreteBase::methode();}
};
P.S. A priori, je voudrais eviter que ConcreteBase herite de VirtualBase
il me semble que le compilo devrait pouvoir trouver la definition de la
methode "methode" via le second heritage....
class VirtualBase{
public:
virtual void methode( void ) = 0;
};
class ConcreteBase{
public:
void methode( void ){
std::cout << " ConcreteBase::methode called" << std::endl;
}
};
class DerivedClass : public VirtualBase, ConcreteBase{
public:
/// Je ne voudrais pas avoir a decommenter la ligne suivante...
////virtual void methode( void ){ ConcreteBase::methode();}
};
P.S. A priori, je voudrais eviter que ConcreteBase herite de VirtualBase
il me semble que le compilo devrait pouvoir trouver la definition de la
methode "methode" via le second heritage....
class VirtualBase{
public:
virtual void methode( void ) = 0;
};
class ConcreteBase{
public:
void methode( void ){
std::cout << " ConcreteBase::methode called" << std::endl;
}
};
class DerivedClass : public VirtualBase, ConcreteBase{
public:
/// Je ne voudrais pas avoir a decommenter la ligne suivante...
////virtual void methode( void ){ ConcreteBase::methode();}
};
P.S. A priori, je voudrais eviter que ConcreteBase herite de VirtualBase
je voudrais compiler le code suivant et cela ne marche pas...
Pourtant, il me semble que le compilo devrait pouvoir trouver
la definition de la methode "methode" via le second
heritage....
Des suggestions ?
#include <iostream>
class VirtualBase{
public:
virtual void methode( void ) = 0;
};
class ConcreteBase{
public:
void methode( void ){
std::cout << " ConcreteBase::methode called" << std::endl;
}
};
class DerivedClass : public VirtualBase, ConcreteBase{
public:
/// Je ne voudrais pas avoir a decommenter la ligne suivante...
////virtual void methode( void ){ ConcreteBase::methode();}
};
int main( int argc, char *argv[] )
{
DerivedClass toto;
toto.methode();
}
P.S. A priori, je voudrais eviter que ConcreteBase herite de
VirtualBase
je voudrais compiler le code suivant et cela ne marche pas...
Pourtant, il me semble que le compilo devrait pouvoir trouver
la definition de la methode "methode" via le second
heritage....
Des suggestions ?
#include <iostream>
class VirtualBase{
public:
virtual void methode( void ) = 0;
};
class ConcreteBase{
public:
void methode( void ){
std::cout << " ConcreteBase::methode called" << std::endl;
}
};
class DerivedClass : public VirtualBase, ConcreteBase{
public:
/// Je ne voudrais pas avoir a decommenter la ligne suivante...
////virtual void methode( void ){ ConcreteBase::methode();}
};
int main( int argc, char *argv[] )
{
DerivedClass toto;
toto.methode();
}
P.S. A priori, je voudrais eviter que ConcreteBase herite de
VirtualBase
je voudrais compiler le code suivant et cela ne marche pas...
Pourtant, il me semble que le compilo devrait pouvoir trouver
la definition de la methode "methode" via le second
heritage....
Des suggestions ?
#include <iostream>
class VirtualBase{
public:
virtual void methode( void ) = 0;
};
class ConcreteBase{
public:
void methode( void ){
std::cout << " ConcreteBase::methode called" << std::endl;
}
};
class DerivedClass : public VirtualBase, ConcreteBase{
public:
/// Je ne voudrais pas avoir a decommenter la ligne suivante...
////virtual void methode( void ){ ConcreteBase::methode();}
};
int main( int argc, char *argv[] )
{
DerivedClass toto;
toto.methode();
}
P.S. A priori, je voudrais eviter que ConcreteBase herite de
VirtualBase
Et comment si prendrait-il ?
class VirtualBase{
public:
virtual void methode( void ) = 0;
};
class ConcreteBase{
public:
void methode( void ){
std::cout << " ConcreteBase::methode called" << std::endl;
}
};
class DerivedClass : public VirtualBase, ConcreteBase{
public:
/// Je ne voudrais pas avoir a decommenter la ligne suivante...
////virtual void methode( void ){ ConcreteBase::methode();}
};
DerivedClass à deux fonctions membres « methode » : VirtualBase::me thode
et ConcreteBase::methode ; sur quel(s) critère(s) le compilateur
fait-il son choix ?P.S. A priori, je voudrais eviter que ConcreteBase herite de VirtualBase
Pourquoi ?
--
Franck Branjonneau
Et comment si prendrait-il ?
class VirtualBase{
public:
virtual void methode( void ) = 0;
};
class ConcreteBase{
public:
void methode( void ){
std::cout << " ConcreteBase::methode called" << std::endl;
}
};
class DerivedClass : public VirtualBase, ConcreteBase{
public:
/// Je ne voudrais pas avoir a decommenter la ligne suivante...
////virtual void methode( void ){ ConcreteBase::methode();}
};
DerivedClass à deux fonctions membres « methode » : VirtualBase::me thode
et ConcreteBase::methode ; sur quel(s) critère(s) le compilateur
fait-il son choix ?
P.S. A priori, je voudrais eviter que ConcreteBase herite de VirtualBase
Pourquoi ?
--
Franck Branjonneau
Et comment si prendrait-il ?
class VirtualBase{
public:
virtual void methode( void ) = 0;
};
class ConcreteBase{
public:
void methode( void ){
std::cout << " ConcreteBase::methode called" << std::endl;
}
};
class DerivedClass : public VirtualBase, ConcreteBase{
public:
/// Je ne voudrais pas avoir a decommenter la ligne suivante...
////virtual void methode( void ){ ConcreteBase::methode();}
};
DerivedClass à deux fonctions membres « methode » : VirtualBase::me thode
et ConcreteBase::methode ; sur quel(s) critère(s) le compilateur
fait-il son choix ?P.S. A priori, je voudrais eviter que ConcreteBase herite de VirtualBase
Pourquoi ?
--
Franck Branjonneau
P.S. A priori, je voudrais eviter que ConcreteBase herite de
VirtualBase
Pourquoi ? Ça me semble une contradiction. Ou bien, elle en
hérite, ou bien, elle ne peut pas en supplanter des fonctions
virtuelles ; on ne peut pas supplanter une fonction virtuelle
dont on ne connaît même pas l'existence.
P.S. A priori, je voudrais eviter que ConcreteBase herite de
VirtualBase
Pourquoi ? Ça me semble une contradiction. Ou bien, elle en
hérite, ou bien, elle ne peut pas en supplanter des fonctions
virtuelles ; on ne peut pas supplanter une fonction virtuelle
dont on ne connaît même pas l'existence.
P.S. A priori, je voudrais eviter que ConcreteBase herite de
VirtualBase
Pourquoi ? Ça me semble une contradiction. Ou bien, elle en
hérite, ou bien, elle ne peut pas en supplanter des fonctions
virtuelles ; on ne peut pas supplanter une fonction virtuelle
dont on ne connaît même pas l'existence.
Le problème est que dans le cas réel la classe abstraite VirtualBase
est définie par un tiers (CORBA) et oblige le développeur de la
classe d'implémentation à définir un GRAND nombre de méthodes (pas
seulement une). De là l'idée de mon collègue d'utiliser plusieurs
classes d'implémentation (ConcreteBase1 ConcreteBase2) relatives à
des méthodes individuelles de VirtualBase (elles ne peuvent donc pas
hériter de la classe abstraite). La classe utilisateur (DerivedClass)
hérite d'une part des contraintes définies par la classe abstraite et
d'autre part des implementations définies par les classes
ConcreteBase1, ConcreteBase2...
Un mécanisme de délégation vers les classes d'implémentation semble
plus approprié dans ce cas, mais dans tous les cas, on n'est obligé
d'écrire 2 fois chacunes des méthodes imposées par la classe
abstraite :
Ce qui chagrine mon collègue, c'est d'avoir à définir m1 et m2 deux
fois (même si la définition dans la classe dérivée
me semble être une aide pour le lecteur).
Plus clair ou de + en + à coté de la plaque ?
Le problème est que dans le cas réel la classe abstraite VirtualBase
est définie par un tiers (CORBA) et oblige le développeur de la
classe d'implémentation à définir un GRAND nombre de méthodes (pas
seulement une). De là l'idée de mon collègue d'utiliser plusieurs
classes d'implémentation (ConcreteBase1 ConcreteBase2) relatives à
des méthodes individuelles de VirtualBase (elles ne peuvent donc pas
hériter de la classe abstraite). La classe utilisateur (DerivedClass)
hérite d'une part des contraintes définies par la classe abstraite et
d'autre part des implementations définies par les classes
ConcreteBase1, ConcreteBase2...
Un mécanisme de délégation vers les classes d'implémentation semble
plus approprié dans ce cas, mais dans tous les cas, on n'est obligé
d'écrire 2 fois chacunes des méthodes imposées par la classe
abstraite :
Ce qui chagrine mon collègue, c'est d'avoir à définir m1 et m2 deux
fois (même si la définition dans la classe dérivée
me semble être une aide pour le lecteur).
Plus clair ou de + en + à coté de la plaque ?
Le problème est que dans le cas réel la classe abstraite VirtualBase
est définie par un tiers (CORBA) et oblige le développeur de la
classe d'implémentation à définir un GRAND nombre de méthodes (pas
seulement une). De là l'idée de mon collègue d'utiliser plusieurs
classes d'implémentation (ConcreteBase1 ConcreteBase2) relatives à
des méthodes individuelles de VirtualBase (elles ne peuvent donc pas
hériter de la classe abstraite). La classe utilisateur (DerivedClass)
hérite d'une part des contraintes définies par la classe abstraite et
d'autre part des implementations définies par les classes
ConcreteBase1, ConcreteBase2...
Un mécanisme de délégation vers les classes d'implémentation semble
plus approprié dans ce cas, mais dans tous les cas, on n'est obligé
d'écrire 2 fois chacunes des méthodes imposées par la classe
abstraite :
Ce qui chagrine mon collègue, c'est d'avoir à définir m1 et m2 deux
fois (même si la définition dans la classe dérivée
me semble être une aide pour le lecteur).
Plus clair ou de + en + à coté de la plaque ?
Merci pour votre longue réponse.
James Kanze wrote:P.S. A priori, je voudrais eviter que ConcreteBase herite de
VirtualBase
Pourquoi ? Ça me semble une contradiction. Ou bien, elle en
hérite, ou bien, elle ne peut pas en supplanter des
fonctions virtuelles ; on ne peut pas supplanter une
fonction virtuelle dont on ne connaît même pas l'existence.
Le problème est que dans le cas réel la classe abstraite
VirtualBase est définie par un tiers (CORBA) et oblige le
développeur de la classe d'implémentation à définir un GRAND
nombre de méthodes (pas seulement une). De là l'idée de mon
collègue d'utiliser plusieurs classes d'implémentation
(ConcreteBase1 ConcreteBase2) relatives à des méthodes
individuelles de VirtualBase (elles ne peuvent donc pas
hériter de la classe abstraite).
La classe utilisateur (DerivedClass) hérite d'une part des
contraintes définies par la classe abstraite et d'autre part
des implementations définies par les classes ConcreteBase1,
ConcreteBase2...
Un mécanisme de délégation vers les classes d'implémentation
semble plus approprié dans ce cas, mais dans tous les cas, on
n'est obligé d'écrire 2 fois chacunes des méthodes imposées
par la classe abstraite :
struct VirtualBase{
void m1() =0;
void m2()=0;
};
struct ConcreteBase1{
void m1{...}
};
struct ConcreteBase2{
void m2{...}
};
class Derived : public VirtualBase, private ConcreteBase1, private
ConcreteBase2{
public:
void m1(){ ConcreteBase1::m1())};
void m2(){ ConcreteBase2::m2())};
};
OU (je préfère..)
class Derived : public VirtualBase{
public:
void m1(){ c1_.m1())};
void m2(){ c2_.m2())};
private:
ConcreteBase1 c1_;
ConcreteBase2 c2_;
};
Ce qui chagrine mon collègue, c'est d'avoir à définir m1 et m2
deux fois (même si la définition dans la classe dérivée me
semble être une aide pour le lecteur).
Plus clair ou de + en + à coté de la plaque ?
Merci pour votre longue réponse.
James Kanze wrote:
P.S. A priori, je voudrais eviter que ConcreteBase herite de
VirtualBase
Pourquoi ? Ça me semble une contradiction. Ou bien, elle en
hérite, ou bien, elle ne peut pas en supplanter des
fonctions virtuelles ; on ne peut pas supplanter une
fonction virtuelle dont on ne connaît même pas l'existence.
Le problème est que dans le cas réel la classe abstraite
VirtualBase est définie par un tiers (CORBA) et oblige le
développeur de la classe d'implémentation à définir un GRAND
nombre de méthodes (pas seulement une). De là l'idée de mon
collègue d'utiliser plusieurs classes d'implémentation
(ConcreteBase1 ConcreteBase2) relatives à des méthodes
individuelles de VirtualBase (elles ne peuvent donc pas
hériter de la classe abstraite).
La classe utilisateur (DerivedClass) hérite d'une part des
contraintes définies par la classe abstraite et d'autre part
des implementations définies par les classes ConcreteBase1,
ConcreteBase2...
Un mécanisme de délégation vers les classes d'implémentation
semble plus approprié dans ce cas, mais dans tous les cas, on
n'est obligé d'écrire 2 fois chacunes des méthodes imposées
par la classe abstraite :
struct VirtualBase{
void m1() =0;
void m2()=0;
};
struct ConcreteBase1{
void m1{...}
};
struct ConcreteBase2{
void m2{...}
};
class Derived : public VirtualBase, private ConcreteBase1, private
ConcreteBase2{
public:
void m1(){ ConcreteBase1::m1())};
void m2(){ ConcreteBase2::m2())};
};
OU (je préfère..)
class Derived : public VirtualBase{
public:
void m1(){ c1_.m1())};
void m2(){ c2_.m2())};
private:
ConcreteBase1 c1_;
ConcreteBase2 c2_;
};
Ce qui chagrine mon collègue, c'est d'avoir à définir m1 et m2
deux fois (même si la définition dans la classe dérivée me
semble être une aide pour le lecteur).
Plus clair ou de + en + à coté de la plaque ?
Merci pour votre longue réponse.
James Kanze wrote:P.S. A priori, je voudrais eviter que ConcreteBase herite de
VirtualBase
Pourquoi ? Ça me semble une contradiction. Ou bien, elle en
hérite, ou bien, elle ne peut pas en supplanter des
fonctions virtuelles ; on ne peut pas supplanter une
fonction virtuelle dont on ne connaît même pas l'existence.
Le problème est que dans le cas réel la classe abstraite
VirtualBase est définie par un tiers (CORBA) et oblige le
développeur de la classe d'implémentation à définir un GRAND
nombre de méthodes (pas seulement une). De là l'idée de mon
collègue d'utiliser plusieurs classes d'implémentation
(ConcreteBase1 ConcreteBase2) relatives à des méthodes
individuelles de VirtualBase (elles ne peuvent donc pas
hériter de la classe abstraite).
La classe utilisateur (DerivedClass) hérite d'une part des
contraintes définies par la classe abstraite et d'autre part
des implementations définies par les classes ConcreteBase1,
ConcreteBase2...
Un mécanisme de délégation vers les classes d'implémentation
semble plus approprié dans ce cas, mais dans tous les cas, on
n'est obligé d'écrire 2 fois chacunes des méthodes imposées
par la classe abstraite :
struct VirtualBase{
void m1() =0;
void m2()=0;
};
struct ConcreteBase1{
void m1{...}
};
struct ConcreteBase2{
void m2{...}
};
class Derived : public VirtualBase, private ConcreteBase1, private
ConcreteBase2{
public:
void m1(){ ConcreteBase1::m1())};
void m2(){ ConcreteBase2::m2())};
};
OU (je préfère..)
class Derived : public VirtualBase{
public:
void m1(){ c1_.m1())};
void m2(){ c2_.m2())};
private:
ConcreteBase1 c1_;
ConcreteBase2 c2_;
};
Ce qui chagrine mon collègue, c'est d'avoir à définir m1 et m2
deux fois (même si la définition dans la classe dérivée me
semble être une aide pour le lecteur).
Plus clair ou de + en + à coté de la plaque ?