j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction virtuelle
comme je le fais pour la fonction type
(et j'ai déjà utilisé avec succès cette faculté dans d'autres p rogrammes)
si j'écris :
int yP;
Property<int> x(&y);
BaseProperty *xx=&x;
alors
xx->type()->value() vaut -1 et pas 50
pourquoi ?
normalement, type() retourne un pointeur Property<int>* et l'appel de
value() devrait valoir 50
le pb, c'est mon compilo ou moi :-( ?
en plus, si je regarde typeid(xx->type()).name(), j'ai BaseProperty * com me
réponse
mais si je définit la fonction type() pour qu'elle retourne des réf érences,
typeid(xx->type()).name() vaut Property
C'est à n'y rien comprendre...
Merci de vos lumières.
Marc
j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction virtuelle
comme je le fais pour la fonction type
(et j'ai déjà utilisé avec succès cette faculté dans d'autres p rogrammes)
si j'écris :
int y=50;
Property<int> x(&y);
BaseProperty *xx=&x;
alors
xx->type()->value() vaut -1 et pas 50
pourquoi ?
normalement, type() retourne un pointeur Property<int>* et l'appel de
value() devrait valoir 50
le pb, c'est mon compilo ou moi :-( ?
en plus, si je regarde typeid(xx->type()).name(), j'ai BaseProperty * com me
réponse
mais si je définit la fonction type() pour qu'elle retourne des réf érences,
typeid(xx->type()).name() vaut Property
C'est à n'y rien comprendre...
Merci de vos lumières.
Marc
j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction virtuelle
comme je le fais pour la fonction type
(et j'ai déjà utilisé avec succès cette faculté dans d'autres p rogrammes)
si j'écris :
int yP;
Property<int> x(&y);
BaseProperty *xx=&x;
alors
xx->type()->value() vaut -1 et pas 50
pourquoi ?
normalement, type() retourne un pointeur Property<int>* et l'appel de
value() devrait valoir 50
le pb, c'est mon compilo ou moi :-( ?
en plus, si je regarde typeid(xx->type()).name(), j'ai BaseProperty * com me
réponse
mais si je définit la fonction type() pour qu'elle retourne des réf érences,
typeid(xx->type()).name() vaut Property
C'est à n'y rien comprendre...
Merci de vos lumières.
Marc
j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction virtuelle
comme je le fais pour la fonction type
(et j'ai déjà utilisé avec succès cette faculté dans d'autres p rogrammes)
si j'écris :
int yP;
Property<int> x(&y);
BaseProperty *xx=&x;
alors
xx->type()->value() vaut -1 et pas 50
pourquoi ?
normalement, type() retourne un pointeur Property<int>* et l'appel de
value() devrait valoir 50
le pb, c'est mon compilo ou moi :-( ?
en plus, si je regarde typeid(xx->type()).name(), j'ai BaseProperty * com me
réponse
mais si je définit la fonction type() pour qu'elle retourne des réf érences,
typeid(xx->type()).name() vaut Property
j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction virtuelle
comme je le fais pour la fonction type
(et j'ai déjà utilisé avec succès cette faculté dans d'autres p rogrammes)
si j'écris :
int y=50;
Property<int> x(&y);
BaseProperty *xx=&x;
alors
xx->type()->value() vaut -1 et pas 50
pourquoi ?
normalement, type() retourne un pointeur Property<int>* et l'appel de
value() devrait valoir 50
le pb, c'est mon compilo ou moi :-( ?
en plus, si je regarde typeid(xx->type()).name(), j'ai BaseProperty * com me
réponse
mais si je définit la fonction type() pour qu'elle retourne des réf érences,
typeid(xx->type()).name() vaut Property
j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction virtuelle
comme je le fais pour la fonction type
(et j'ai déjà utilisé avec succès cette faculté dans d'autres p rogrammes)
si j'écris :
int yP;
Property<int> x(&y);
BaseProperty *xx=&x;
alors
xx->type()->value() vaut -1 et pas 50
pourquoi ?
normalement, type() retourne un pointeur Property<int>* et l'appel de
value() devrait valoir 50
le pb, c'est mon compilo ou moi :-( ?
en plus, si je regarde typeid(xx->type()).name(), j'ai BaseProperty * com me
réponse
mais si je définit la fonction type() pour qu'elle retourne des réf érences,
typeid(xx->type()).name() vaut Property
Marc G wrote:j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction virtuelle
comme je le fais pour la fonction type
(et j'ai déjà utilisé avec succès cette faculté dans d'autres programmes)
Oui, car les types de retour de "type()" ont une relation d'héritage
publique. Property* est >>dérivée<< de BaseProperty*. C'est
uniquement dans ces cas-là que les types de retour (uniquement
pointeurs ou références) peuvent différer. Cela se nomme la
covariance des types de retour.
si j'écris :
int yP;
Property<int> x(&y);
BaseProperty *xx=&x;
alors
xx->type()->value() vaut -1 et pas 50
pourquoi ?
normalement, type() retourne un pointeur Property<int>* et l'appel de
value() devrait valoir 50
le pb, c'est mon compilo ou moi :-( ?
en plus, si je regarde typeid(xx->type()).name(), j'ai BaseProperty * c omme
réponse
Il faut se mettre à la place du compilateur.
Le type statique de *xx est BaseProperty. Le fait que son type
dynamique soit Property change simplement les pointeurs des fonctions
virtuelles. Mais *xx est un BaseProperty, donc tout le typage défini
dans la classe BaseProperty (y compris le type de retour de ces
fonctions virtuelles) sera celui de xx.
Le type dynamique(et statique) de xx->type() sera donc BaseProperty *,
car xx->type() n'est qu'un pointeur. Tu l'obtiens en utilisant typeid :
typeid(xx->type().name() //BaseProperty *
Par contre, le type dynamique de l'objet pointé par xx->type() est
Property :
typeid(*xx->type().name() //Property
Donc si tu veux obtenir 50 et pas -1, il te suffit simplement de
déclarer "value()" virtual.
J'ai oublié de préciser que, dans ton code, tu peux déclarer
Marc G wrote:
j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction virtuelle
comme je le fais pour la fonction type
(et j'ai déjà utilisé avec succès cette faculté dans d'autres programmes)
Oui, car les types de retour de "type()" ont une relation d'héritage
publique. Property* est >>dérivée<< de BaseProperty*. C'est
uniquement dans ces cas-là que les types de retour (uniquement
pointeurs ou références) peuvent différer. Cela se nomme la
covariance des types de retour.
si j'écris :
int y=50;
Property<int> x(&y);
BaseProperty *xx=&x;
alors
xx->type()->value() vaut -1 et pas 50
pourquoi ?
normalement, type() retourne un pointeur Property<int>* et l'appel de
value() devrait valoir 50
le pb, c'est mon compilo ou moi :-( ?
en plus, si je regarde typeid(xx->type()).name(), j'ai BaseProperty * c omme
réponse
Il faut se mettre à la place du compilateur.
Le type statique de *xx est BaseProperty. Le fait que son type
dynamique soit Property change simplement les pointeurs des fonctions
virtuelles. Mais *xx est un BaseProperty, donc tout le typage défini
dans la classe BaseProperty (y compris le type de retour de ces
fonctions virtuelles) sera celui de xx.
Le type dynamique(et statique) de xx->type() sera donc BaseProperty *,
car xx->type() n'est qu'un pointeur. Tu l'obtiens en utilisant typeid :
typeid(xx->type().name() //BaseProperty *
Par contre, le type dynamique de l'objet pointé par xx->type() est
Property :
typeid(*xx->type().name() //Property
Donc si tu veux obtenir 50 et pas -1, il te suffit simplement de
déclarer "value()" virtual.
J'ai oublié de préciser que, dans ton code, tu peux déclarer
Marc G wrote:j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction virtuelle
comme je le fais pour la fonction type
(et j'ai déjà utilisé avec succès cette faculté dans d'autres programmes)
Oui, car les types de retour de "type()" ont une relation d'héritage
publique. Property* est >>dérivée<< de BaseProperty*. C'est
uniquement dans ces cas-là que les types de retour (uniquement
pointeurs ou références) peuvent différer. Cela se nomme la
covariance des types de retour.
si j'écris :
int yP;
Property<int> x(&y);
BaseProperty *xx=&x;
alors
xx->type()->value() vaut -1 et pas 50
pourquoi ?
normalement, type() retourne un pointeur Property<int>* et l'appel de
value() devrait valoir 50
le pb, c'est mon compilo ou moi :-( ?
en plus, si je regarde typeid(xx->type()).name(), j'ai BaseProperty * c omme
réponse
Il faut se mettre à la place du compilateur.
Le type statique de *xx est BaseProperty. Le fait que son type
dynamique soit Property change simplement les pointeurs des fonctions
virtuelles. Mais *xx est un BaseProperty, donc tout le typage défini
dans la classe BaseProperty (y compris le type de retour de ces
fonctions virtuelles) sera celui de xx.
Le type dynamique(et statique) de xx->type() sera donc BaseProperty *,
car xx->type() n'est qu'un pointeur. Tu l'obtiens en utilisant typeid :
typeid(xx->type().name() //BaseProperty *
Par contre, le type dynamique de l'objet pointé par xx->type() est
Property :
typeid(*xx->type().name() //Property
Donc si tu veux obtenir 50 et pas -1, il te suffit simplement de
déclarer "value()" virtual.
J'ai oublié de préciser que, dans ton code, tu peux déclarer
Marc G wrote:j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction virtuelle
comme je le fais pour la fonction type
(et j'ai déjà utilisé avec succès cette faculté dans d'autres programmes)
Je ne sais pas où tu as pu utiliser cette "possibilité" mais elle
n'est certainement normalisée !! Elle est même innimplémentable ...
Marc G wrote:
j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction virtuelle
comme je le fais pour la fonction type
(et j'ai déjà utilisé avec succès cette faculté dans d'autres programmes)
Je ne sais pas où tu as pu utiliser cette "possibilité" mais elle
n'est certainement normalisée !! Elle est même innimplémentable ...
Marc G wrote:j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction virtuelle
comme je le fais pour la fonction type
(et j'ai déjà utilisé avec succès cette faculté dans d'autres programmes)
Je ne sais pas où tu as pu utiliser cette "possibilité" mais elle
n'est certainement normalisée !! Elle est même innimplémentable ...
j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction virtuelle
comme je le fais pour la fonction type
(et j'ai déjà utilisé avec succès cette faculté dans d'autres programmes)
si j'écris :
int yP;
Property<int> x(&y);
BaseProperty *xx=&x;
alors
xx->type()->value() vaut -1 et pas 50
pourquoi ?
normalement, type() retourne un pointeur Property<int>* et l'appel de
value() devrait valoir 50
le pb, c'est mon compilo ou moi :-( ?
en plus, si je regarde typeid(xx->type()).name(), j'ai BaseProperty * comme
réponse
j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction virtuelle
comme je le fais pour la fonction type
(et j'ai déjà utilisé avec succès cette faculté dans d'autres programmes)
si j'écris :
int yP;
Property<int> x(&y);
BaseProperty *xx=&x;
alors
xx->type()->value() vaut -1 et pas 50
pourquoi ?
normalement, type() retourne un pointeur Property<int>* et l'appel de
value() devrait valoir 50
le pb, c'est mon compilo ou moi :-( ?
en plus, si je regarde typeid(xx->type()).name(), j'ai BaseProperty * comme
réponse
j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction virtuelle
comme je le fais pour la fonction type
(et j'ai déjà utilisé avec succès cette faculté dans d'autres programmes)
si j'écris :
int yP;
Property<int> x(&y);
BaseProperty *xx=&x;
alors
xx->type()->value() vaut -1 et pas 50
pourquoi ?
normalement, type() retourne un pointeur Property<int>* et l'appel de
value() devrait valoir 50
le pb, c'est mon compilo ou moi :-( ?
en plus, si je regarde typeid(xx->type()).name(), j'ai BaseProperty * comme
réponse
J'ai oublié de préciser que, dans ton code, tu peux déclarer
"value()" en virtual car x est un Property<int>, donc "value()" aura le
même type de retour dans Property et BaseProperty. Si tu utilises un
Property<double> par exemple, tu ne pourras plus déclarer "value()" en
fonction virtuelle.
J'ai oublié de préciser que, dans ton code, tu peux déclarer
"value()" en virtual car x est un Property<int>, donc "value()" aura le
même type de retour dans Property et BaseProperty. Si tu utilises un
Property<double> par exemple, tu ne pourras plus déclarer "value()" en
fonction virtuelle.
J'ai oublié de préciser que, dans ton code, tu peux déclarer
"value()" en virtual car x est un Property<int>, donc "value()" aura le
même type de retour dans Property et BaseProperty. Si tu utilises un
Property<double> par exemple, tu ne pourras plus déclarer "value()" en
fonction virtuelle.
j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction
virtuelle comme je le fais pour la fonction type (et j'ai déjà
utilisé avec succès cette faculté dans d'autres programmes)
si j'écris :
int yP;
Property<int> x(&y);
BaseProperty *xx=&x;
alors
xx->type()->value() vaut -1 et pas 50
pourquoi ?
normalement, type() retourne un pointeur Property<int>* et l'appel de
value() devrait valoir 50
le pb, c'est mon compilo ou moi :-( ?
en plus, si je regarde typeid(xx->type()).name(), j'ai BaseProperty * com me
réponse
mais si je définit la fonction type() pour qu'elle retourne des réf érences,
typeid(xx->type()).name() vaut Property
j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction
virtuelle comme je le fais pour la fonction type (et j'ai déjà
utilisé avec succès cette faculté dans d'autres programmes)
si j'écris :
int y=50;
Property<int> x(&y);
BaseProperty *xx=&x;
alors
xx->type()->value() vaut -1 et pas 50
pourquoi ?
normalement, type() retourne un pointeur Property<int>* et l'appel de
value() devrait valoir 50
le pb, c'est mon compilo ou moi :-( ?
en plus, si je regarde typeid(xx->type()).name(), j'ai BaseProperty * com me
réponse
mais si je définit la fonction type() pour qu'elle retourne des réf érences,
typeid(xx->type()).name() vaut Property
j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction
virtuelle comme je le fais pour la fonction type (et j'ai déjà
utilisé avec succès cette faculté dans d'autres programmes)
si j'écris :
int yP;
Property<int> x(&y);
BaseProperty *xx=&x;
alors
xx->type()->value() vaut -1 et pas 50
pourquoi ?
normalement, type() retourne un pointeur Property<int>* et l'appel de
value() devrait valoir 50
le pb, c'est mon compilo ou moi :-( ?
en plus, si je regarde typeid(xx->type()).name(), j'ai BaseProperty * com me
réponse
mais si je définit la fonction type() pour qu'elle retourne des réf érences,
typeid(xx->type()).name() vaut Property
Marc G wrote:j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction virtuelle
comme je le fais pour la fonction type
(et j'ai déjà utilisé avec succès cette faculté dans d'autres programmes)
Je ne sais pas où tu as pu utiliser cette "possibilité" mais elle
n'est certainement normalisée !! Elle est même innimplémentable ...
En effet, disons que tu as ce code :
struct A
{
virtual ~A() {}
virtual int f() { return 0; }
};
struct B : public A
{
virtual B& f() { return *this; }
};
Marc G wrote:
j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction virtuelle
comme je le fais pour la fonction type
(et j'ai déjà utilisé avec succès cette faculté dans d'autres programmes)
Je ne sais pas où tu as pu utiliser cette "possibilité" mais elle
n'est certainement normalisée !! Elle est même innimplémentable ...
En effet, disons que tu as ce code :
struct A
{
virtual ~A() {}
virtual int f() { return 0; }
};
struct B : public A
{
virtual B& f() { return *this; }
};
Marc G wrote:j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction virtuelle
comme je le fais pour la fonction type
(et j'ai déjà utilisé avec succès cette faculté dans d'autres programmes)
Je ne sais pas où tu as pu utiliser cette "possibilité" mais elle
n'est certainement normalisée !! Elle est même innimplémentable ...
En effet, disons que tu as ce code :
struct A
{
virtual ~A() {}
virtual int f() { return 0; }
};
struct B : public A
{
virtual B& f() { return *this; }
};
Marc G wrote:j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction virtuelle
comme je le fais pour la fonction type
(et j'ai déjà utilisé avec succès cette faculté dans d'autres programmes)
Oui, car les types de retour de "type()" ont une relation d'héritage
publique. Property* est >>dérivée<< de BaseProperty*. C'est
uniquement dans ces cas-là que les types de retour (uniquement
pointeurs ou références) peuvent différer. Cela se nomme la
covariance des types de retour.si j'écris :
int yP;
Property<int> x(&y);
BaseProperty *xx=&x;
alors
xx->type()->value() vaut -1 et pas 50
pourquoi ?
normalement, type() retourne un pointeur Property<int>* et l'appel de
value() devrait valoir 50
le pb, c'est mon compilo ou moi :-( ?
en plus, si je regarde typeid(xx->type()).name(), j'ai BaseProperty * c omme
réponse
Il faut se mettre à la place du compilateur.
Le type statique de *xx est BaseProperty. Le fait que son type
dynamique soit Property change simplement les pointeurs des fonctions
virtuelles.
Donc si tu veux obtenir 50 et pas -1, il te suffit simplement de
déclarer "value()" virtual.
Marc G wrote:
j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction virtuelle
comme je le fais pour la fonction type
(et j'ai déjà utilisé avec succès cette faculté dans d'autres programmes)
Oui, car les types de retour de "type()" ont une relation d'héritage
publique. Property* est >>dérivée<< de BaseProperty*. C'est
uniquement dans ces cas-là que les types de retour (uniquement
pointeurs ou références) peuvent différer. Cela se nomme la
covariance des types de retour.
si j'écris :
int y=50;
Property<int> x(&y);
BaseProperty *xx=&x;
alors
xx->type()->value() vaut -1 et pas 50
pourquoi ?
normalement, type() retourne un pointeur Property<int>* et l'appel de
value() devrait valoir 50
le pb, c'est mon compilo ou moi :-( ?
en plus, si je regarde typeid(xx->type()).name(), j'ai BaseProperty * c omme
réponse
Il faut se mettre à la place du compilateur.
Le type statique de *xx est BaseProperty. Le fait que son type
dynamique soit Property change simplement les pointeurs des fonctions
virtuelles.
Donc si tu veux obtenir 50 et pas -1, il te suffit simplement de
déclarer "value()" virtual.
Marc G wrote:j'ai le code suivant :
class BaseProperty {
public :
virtual BaseProperty* type(void) { return this;}
int value(void) { return -1;}
};
// représente une propriété d'un certain type
template <typename U>
class Property : public BaseProperty {
public :
Property(U* u) : _u(u) {}
virtual Property* type(void) { return this;}
U value(void) { return *_u; }
U* _u;
};
Mon problème :
j'ai lu qu'on pouvait changer le type de retour d'une fonction virtuelle
comme je le fais pour la fonction type
(et j'ai déjà utilisé avec succès cette faculté dans d'autres programmes)
Oui, car les types de retour de "type()" ont une relation d'héritage
publique. Property* est >>dérivée<< de BaseProperty*. C'est
uniquement dans ces cas-là que les types de retour (uniquement
pointeurs ou références) peuvent différer. Cela se nomme la
covariance des types de retour.si j'écris :
int yP;
Property<int> x(&y);
BaseProperty *xx=&x;
alors
xx->type()->value() vaut -1 et pas 50
pourquoi ?
normalement, type() retourne un pointeur Property<int>* et l'appel de
value() devrait valoir 50
le pb, c'est mon compilo ou moi :-( ?
en plus, si je regarde typeid(xx->type()).name(), j'ai BaseProperty * c omme
réponse
Il faut se mettre à la place du compilateur.
Le type statique de *xx est BaseProperty. Le fait que son type
dynamique soit Property change simplement les pointeurs des fonctions
virtuelles.
Donc si tu veux obtenir 50 et pas -1, il te suffit simplement de
déclarer "value()" virtual.