C++: l'Accès aux méthodes parents et les variables
De quelle manière dois-je accéder à cette méthode parent et parent variable?
class Base
{
public:
std::string mWords;
Base() { mWords = "blahblahblah" }
};
class Foundation
{
public:
Write( std::string text )
{
std::cout << text;
}
};
class Child : public Base, public Foundation
{
DoSomething()
{
this->Write( this->mWords );
//or
Foundation::Write( Base::mWords );
}
};
Grâce.
Edit: Et si il existe une ambiguïté?
OriginalL'auteur | 2010-12-24
Vous devez vous connecter pour publier un commentaire.
Les deux syntaxes que vous utilisez dans votre code (
this->...
et les noms qualifiés) ne sont nécessaires en particulier lorsqu'il existe une ambiguïté ou une autre la recherche d'un nom, comme le nom de la clandestinité, le modèle de la classe de base etc.Quand il n'y a pas d'ambiguïté ou d'autres problèmes que vous n'avez pas besoin de ces syntaxes. Tous vous avez besoin est un simple nom non qualifié, comme
Write
dans votre exemple. JusteWrite
, pasthis->Write
et pasFoundation::Write
. La même chose s'applique àmWords
.I. e. dans votre exemple, une plaine de
Write( mWords )
suffira.Pour illustrer ce qui précède, si votre
DoSomething
méthode avaitmWords
paramètre, comme danspuis ce local
mWords
paramètre masquer classe héritée membremWords
et vous auriez à utiliserou
pour exprimer votre intention correctement, c'est à dire à la pause par le biais de la clandestinité.
Si votre
Child
classe a aussi son propremWords
membre, comme danspuis ce nom se cache l'héritage
mWords
. Lethis->mWords
approche dans ce cas, ne serait pas vous aider à révéler le nom propre, et vous auriez à utiliser le nom qualifié pour résoudre le problèmeSi vos deux classes de base avait un
mWords
membre, comme danspuis dans
Child::DoSomething
lamWords
nom d'être ambigu, et que vous avez à fairepour résoudre l'ambiguïté.
Mais, encore une fois, dans votre exemple, où il n'y a pas d'ambiguïté et pas de nom de cacher tout cela est complètement inutile.
OriginalL'auteur
Car il n'y a pas de conflit de noms, il suffit d'utiliser
Write(mWords)
. Utiliser les 2 autres si vous avez des variables locales qui sont en conflit, ou lorsque les noms sont cachés.et qu'entendez-vous par "lorsque les noms sont cachés"?
si c'est un conflit entre les variables locales et les variables de membre (par exemple, votre classe est une variable de membre
i
, et votre méthode utilise une variable localei
), l'utilisationthis
. siA
déclare une fonctionf
, etB
hériteA
et déclaref
aussi, et vous souhaitez appelerA
'sf
deB
, puis utilisezA::f
.OriginalL'auteur
Je pense que c'est l'approche la plus commune:
à moins que vous exécutez dans l'ambiguïté.
S'il y a ambiguïté ou l'ombrage parce que vous voulez quelque chose dans un (particulier) de la classe de base, mais quelque chose dans une autre classe de base (ou de cette classe) se cache, puis utilisez le
Base::name
syntaxe.Si une variable locale est l'occultation de l'un de vos membres, puis utilisez
this->
, si, en général, vous devriez essayer d'éviter cette situation. (c'est à dire: essayez d'éviter de nommer les habitants de telle sorte qu'ils de l'ombre membres)Je suppose, une manière de regarder, il serait d'utiliser la première de ces qui fonctionne et fait ce que vous voulez:
name
this->name
Base::name
OriginalL'auteur