Descente de l'héritage C ++
J'ai ma classe de base comme suit:
class point //concrete class
{
... //implementation
}
class subpoint : public point //concrete class
{
... //implementation
}
Comment puis-je effectuer un cast d'un objet point à un sous-point de l'objet? J'ai essayé les trois opérations suivantes:
point a;
subpoint* b = dynamic_cast<subpoint*>(&a);
subpoint* b = (subpoint*)a;
subpoint b = (subpoint)a;
Quel est le problème avec ces distributions?
source d'informationauteur CodeKingPlusPlus
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas, à moins que ce soit
point
a un opérateur de conversion, ousubpoint
a une conversion de constructeur, dans ce cas les types d'objets peuvent être convertis sans avoir besoin d'être exprimés.Vous pourriez lancer à partir d'un
point
référence (ou pointeur) à unsubpoint
référence (ou un pointeur), si la visée de l'objet étaient en fait de typesubpoint
:La première (
static_cast
) est plus dangereux; il n'existe pas de vérifier que la conversion est valide, donc sia
ne fait pas référence à unsubpoint
puis à l'aideb1
aura un comportement indéterminé.La deuxième (
dynamic_cast
) est plus sûre, mais ne fonctionnera que sipoint
est polymorphe (qui est, si elle a une fonction virtuelle). Sia
se réfère à un objet de type incompatible, alors il va lever une exception.Pour le premier exemple,
dynamic_cast
ne fonctionne que si il y a au moins une méthode virtuelle dans la classe de base. Et si l'objet n'est en fait pas le type que vous êtes en train de jeter, le résultat sera NUL.Pour le deuxième exemple, vous avez besoin
&a
au lieu dea
mais une fois que vous avez fixé que vous aurez un comportement indéfini, parce que le type de l'objet est incorrect.Le troisième exemple implique un
operator subpoint()
méthode danspoint
pour faire une conversion, tout en créant une copie.Dans l'ensemble, cela ne fonctionnera pas car
point
n'est pas unsubpoint
; seulement, l'inverse est vrai. Cependant, il y a d'autres questions.Dans l'ordre:
dynamic_cast
ne fonctionne que sur les types polymorphes, c'est à dire, les types qui déclarent au moins une fonction virtuelle. Ma conjecture est quepoint
n'a pas de fonctions virtuelles, ce qui signifie qu'il ne peut pas être utilisé avecdynamic_cast
.Pour ce jeté de travail,
point
doit déclarer un opérateur de conversion desubpoint *
par exemple,point::operator subpoint *()
.Pour ce jeté de travail, point besoin de déclarer un opérateur de conversion de
subpoint
ousubpoint
besoin d'avoir un constructeur qui prend un paramètre modulable depoint
.Le but d'une dynamique de fonte est de "vérifier au moment de l'exécution si un objet est d'un certain type dans la hiérarchie". Alors maintenant, nous allons regarder ce que vous avez:
En revanche, il aurait travaillé:
a
ne peut pas être fait dans unsubpoint
. que la mise en œuvre n'est pas là.Le fait que vous tentez de le faire. Un
point
n'est pas unsubpoint
je serais surpris si cela a fonctionné.