Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

heritage et propriétés à la microsoft

2 réponses
Avatar
Bernie
Bonjour,
Je me pose la question suivant :
class Base
{
public :
Base();
~Base();

virtual MaRoutineVPure() = 0;

_declspec(property(get=GetVal, put=PutVal));
long value;

virtual GetVal() = 0;
virtual PutVal() = 0;
};

class QuiHerite : public Base
{
public :
QuiHerite();
~QuiHerite();

MaRoutineVPure();
GetVal(){return MaValueDeCetteClass;}
PutVal(long i){MaValueDeCetteClass = i;}

private :
long MaValueDeCetteClass;
};

On ne peut pas definir un objet Base, mais on peut caster un pointeur
sur QuiHerite en un pointeur sur Base...Et la je me demande ce qui se
passe quand on ecrit

QuiHerite* ptrHerite = new QuiHerite();
ptrHerite->value = 0;//OK jusque la je comprend l'expansion réalisée par
le compilo !!!
Base* ptrBase = (Base*)PtrHerite;
ptrBase->value = 0;//La j'ai un doute !!!!

J'ai pas essayé mais meme si le compilo resoud bien la propriété en
remplacant par ptrBase->PutVal(0) et que comme avec un heritage
classique la bonne implementation de PutVal sera appelé, ca me semble
vraiment scabreux à lire et surtout comment reproduire ce comportement
avec des outils de programmation standard !!!

Y-a-t-il des avis sur la question ?

Le contexte est qu'un collegue est en train de faire du portage de code
dévellopé par un stagiaire sous Zindows et qu'il essaye de réécrire un
max de code sous une forme standard et cross-compilable...

2 réponses

Avatar
James Kanze
Bernie wrote:

Je me pose la question suivant :
class Base
{
public :
Base();
~Base();


virtual MaRoutineVPure() = 0;


_declspec(property(get=GetVal, put=PutVal));
long value;


virtual GetVal() = 0;
virtual PutVal() = 0;
};


class QuiHerite : public Base
{
public :
QuiHerite();
~QuiHerite();


MaRoutineVPure();
GetVal(){return MaValueDeCetteClass;}
PutVal(long i){MaValueDeCetteClass = i;}


private :
long MaValueDeCetteClass;
};


On ne peut pas definir un objet Base, mais on peut caster un
pointeur sur QuiHerite en un pointeur sur Base...Et la je me
demande ce qui se passe quand on ecrit


QuiHerite* ptrHerite = new QuiHerite();
ptrHerite->value = 0;//OK jusque la je comprend l'expansion réalisée par
le compilo !!!
Base* ptrBase = (Base*)PtrHerite;
ptrBase->value = 0;//La j'ai un doute !!!!


Pourquoi ? Qu'est-ce qui a changé ?

S'il y avait aussi une variable membre du nom value dans
QuiHerite, ça changerait quelque chose, mais sinon...

J'ai pas essayé mais meme si le compilo resoud bien la
propriété en remplacant par ptrBase->PutVal(0)


Mais pourquoi est-ce qu'il ferait une chose comme ça ? Tu
n'appelles pas une fonction. Tu accèdes à une variable. Une
variable n'est jamais virtuelle.

et que comme avec un heritage classique la bonne
implementation de PutVal sera appelé,


Qu'est-ce que PutVal a à faire là-dedans ? Tu ne le nom même
pas.

ca me semble vraiment scabreux à lire et surtout comment
reproduire ce comportement avec des outils de programmation
standard !!!


Y-a-t-il des avis sur la question ?


Je n'ai pas compris la question. Quel comportement est-ce que tu
veux, et pourquoi ? Pour moi, la situation est simple : tu
accèdes à une variable membre, dans les deux cas. Elle n'est pas
virtuelle. (Des variables ne peuvent pas être virtuelles. Mais
une fonction non virtuelle se comporterait de la même façon.) Le
compilateur cherche le nom selon le type statique de
l'expression. Toujours. Ici, dans les deux cas, il trouve
Base::value. Et pour quelque chose de non virtuelle, ça
s'arrête là.

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

Avatar
Fabien LE LEZ
On Wed, 29 Jun 2005 20:47:28 +0200, James Kanze :

Mais pourquoi est-ce qu'il ferait une chose comme ça ? Tu
n'appelles pas une fonction. Tu accèdes à une variable.


Non, pas à une variable justement : à une "propriété" à la Microsoft,
qui est (si j'ai bien compris) une façon d'utiliser un proxy sans le
dire.

AMHA, le mieux pour répondre à la question initiale est de consulter
la documentation de Microsoft ; le C++ standard risque d'être peu
utile ici.