C++ Accès de membre de classe dérivée de la classe de base pointeur
Si j'alloue un objet d'une classe Derived
(avec une classe de base de Base
), et de stocker un pointeur vers cet objet dans une variable qui pointe vers la classe de base, comment puis-je accéder aux membres de la Derived
classe?
Voici un exemple:
class Base
{
public:
int base_int;
};
class Derived : public Base
{
public:
int derived_int;
};
Base* basepointer = new Derived();
basepointer-> //Access derived_int here, is it possible? If so, then how?
Vous devez vous connecter pour publier un commentaire.
Non, vous ne pouvez pas accéder
derived_int
parce quederived_int
fait partie deDerived
, tandis quebasepointer
est un pointeur versBase
.Vous pouvez le faire dans l'autre sens, si:
Issus des classes héritent les membres de la classe de base, et non l'inverse.
Toutefois, si votre
basepointer
a été pointant vers une instance deDerived
alors vous pourriez avoir accès par l'entremise d'un casting:Notez que vous aurez besoin de changer votre héritage à
public
première:Derived
ou pas. Si vous êtes sûr à 100% (nous sommes ici) puisstatic_cast
est très bien.static_cast
est la bonne chose ici.reinterpret_cast
de dresser, mais il fait quelque chose de mal dans de nombreux cas.reinterpret_cast
ne change pas l'adresse stockée dans le pointeur, c'est juste réinterprète il. Cependant,static_cast
a parfois besoin de compenser le pointeur (par exemple, siDerived
hérité de plusieurs bases)Vous dansez sur le champ de mines ici. La classe de base ne peut jamais savoir que c'est en fait une instance de la dérivée. La meilleure façon de le faire serait d'introduire une fonction virtuelle dans la base:
Si
basepointer
points comme autre chose qu'unDerived
, votre programme va mourir horriblement, qui est le résultat prévu.Alternativement, vous pouvez utiliser
dynamic_cast<Derived>(basepointer)
. Mais vous avez besoin d'au moins une fonction virtuelle dans leBase
pour cela, et être prêt à rencontrer un zéro.La
static_cast<>
, comme certains le suggèrent, est un moyen sûr de se tirer dans le pied. Ne contribuent pas à la grande cache de "l'insécurité de la C de la famille des langues" histoires d'horreur.static_cast
n'est pas un moyen de se tirer dans le pied. Je pense que vous êtes de le confondre avec un C cast explicite notation(T)x
.static_cast
sur l'autre main est de type sécurisé, maisdynamic_cast
va retourner un pointeur null si il ne peut pas convertir toutstatic_cast
émettra une erreur du compilateur.vous pouvez utiliser PFI
fondamentalement, vous utilisez la classe dérivée dans le modèle de la classe de base
Il est possible, en laissant de la classe de base à connaître le type de la classe dérivée. Cela peut être fait en faisant de la classe de base d'un modèle de type dérivé. Ce C++ langage est appelé curieusement récurrents pattern template.
Sachant que la classe dérivée de la classe de base, le pointeur peut être statique-coulé à un pointeur sur un type dérivé.
//si vous savez ce que la classe dérivée que vous allez utiliser
Dérivés* derivedpointer = dynamic_cast < Dérivés * > basepointer;
//ensuite, vous pouvez accéder à la classe dérivée à l'aide de derivedpointer