CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

cast polymorphisme c++

Pseudo supprimé
Pseudo supprimé 18 décembre 2016 à 13:15:55

j'étais en train de bosser un exam d'info.

Et je tombe sur ce cas :


class Vehicle
{
public:
	int year;

	void Test()
	{
		printf("Year %d \n",year);
	}
};

class Moto : public Vehicle
{
public:
	int speed;

	void affiche()
	{
		printf("Speed %d \n",speed);
	}
};


int _tmain(int argc, _TCHAR* argv[])
{

	Vehicle* vehicle = new Vehicle();
	vehicle->year = 2005;

	Moto* moto = (Moto*)vehicle;
	moto->speed = 120;
	moto->affiche();

	printf("Moto : 0x%p \n",moto);
	printf("speed : 0x%p \n",&moto->speed);

	return 0;
}

https://image.noelshack.com/fichiers/2016/50/1482063464-sans-titre.png

Je créer un Vehicle, que je supposais allouer un objet de type Vehicle, donc avec seulement la variable year.
Que ce passe t-il en interne alors lorsque je cast le (Vehicle*) en tant que (Moto*) ?

Comment se fait-il que je puisse utiliser la variable speed? et la fonction affiche?
J'aurais pensé que comme j'ai créer un objet de type Vehicle, alors la variable speed n'est pas alloué en mémoire.

Message édité le 18 décembre 2016 à 13:19:23 par Pseudo supprimé
Thars
Thars
Niveau 10
18 décembre 2016 à 13:40:39

Tu déclares un pointeur sur une Moto...
Si tu faisais Vehicle* v = (Moto*)vehicle; moto->speed = 120; ce serait différent et ça poserait sans doute un souci, mais là je vois pas le problème. :(

Pseudo supprimé
Pseudo supprimé 18 décembre 2016 à 13:59:40
Vehicle* vehicle = new Vehicle();
Moto* moto = (Moto*)vehicle;

Je créer un Vehicle, que je cast ensuite en tant que Moto. Le truc est que j'ai créer un Vehicle mais ce n'est pas une moto qui contient des propriétés supplémentaires. Comment se fait-il que je puisse utiliser les propriétés d'une Moto sachant que c'est un Vehicle que j'ai alloué.

jenaipasdenom
jenaipasdenom
Niveau 15
18 décembre 2016 à 14:50:10

À première vue, je serais tenté de dire que ça va causer une segfault. Le compilateur ne va pas broncher, parce que Moto dérive de Vehicle et c'est donc tout à fait possible de faire un static_cast en Moto, mais au runtime ça va probablement chier parce que comme tu l'as dit, tu n'as alloué que un Vehicle.

BTW, petit commentaire sur ce code. Ne jamais faire de cast style C en C++, car ça n'indique pas clairement tes intentions. Par exemple, dans ce cas vu que Moto dérive de Vehicle, le compilateur va faire un static_cast, mais si ce n'était pas le cas ça aurait fait un reinterpret_cast de ton pointeur, ce qui n'est probablement pas ce que tu veux. Aussi, le cast style C peut faire des const_cast implicites, ce qui n'est pas une bonne chose non plus. En clair, utilise les cast style C++, pour éviter des bugs vicieux au runtime.

Pseudo supprimé
Pseudo supprimé 18 décembre 2016 à 15:16:49

Oui normalement j'utilise les cast c++ :)

Bah justement je pensais comme toi que le compilateur dis rien car c'est correct au niveau de la syntaxe, Mais qu'au runtime ça ne devrait pas fonctionner, pourtant j'ai rajouté un screen et au runtime ca marche sans problème.

Et je me demandais justement POURQUOI! (est ce que ce serait parce que la mémoire à + 0x4 après l'allocation de Vehicle est libre. Du coup même si ca n'appartient pas directement à l'objet, cette zone est accessible et donc utilisé.) Donc dans certain cas ça peut marcher mais dans d'autre non.

Après que la fonction fonctionne, c'est pas surprenant une fois compilé ce n'est ni plus ou moins :

void affiche(Moto* pThis)
{
printf("Speed %d \n",*(pThis+0x4));
}

Message édité le 18 décembre 2016 à 15:17:18 par Pseudo supprimé
Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment