2009-08-19 5 views
0

Est-il possible d'accéder à une fonction de classe de base ayant la même signature que celle d'une fonction de classe dérivée utilisant un objet de classe dérivé? voici un échantillon de ce que je suis en indiquant ci-dessous ..Classe de base d'accès fn avec la même signature que l'objet de classe dérivé

class base1 { 
public: 
    void test() 
    {cout<<"base1"<<endl;}; 
}; 

class der1 : public base1 { 
public: 
    void test() 
    {cout<<"der1"<<endl;}; 
}; 

int main() { 
der1 obj; 
obj.test(); // How can I access the base class 'test()' here?? 
return 0; 
} 
+1

Peut-être que tag 'override' doit être supprimée. Je ne suis pas sûr à 100%, mais je crois que le terme correct est «cacher» plutôt que de passer outre. –

Répondre

6

Vous devez saisir le nom complet de la méthode qui est incompatible avec celle héritée.

utilisation obj.base1 :: test()

+3

Le terme formel est "overrides", puisque les signatures correspondent. Sinon, vous diriez que le dérivé "cache" la méthode de la classe de base. Dans les deux cas, il n'y a plus de "nom de méthode héritée". – MSalters

+1

Je doute que le terme correct soit «override» ou «hide». Dans la norme C++, 'override' est seulement utilisé avec les fonctions virtuelles et dans la recherche du nom de membre 10.2, la norme dit: 'Un membre f dans un sous-objet B cache un membre f dans un sous-objet A si A est un sous-objet de classe de base de B. ' –

+0

Merci Arkaitz. –

1

Vous ne pouvez pas remplacer une méthode dans la classe dérivée si vous n'avez pas fourni un mot-clé virtuelle.

class base1 
{ 
    public: 
     void test() 
     { 
      cout << "base1" << endl; 
     }; 
}; 

class der1 : public base1 
{ 
    public: 
     void test() 
     { 
      cout << "der1" << endl; 
     }; 
}; 

int main() 
{ 
    der1 obj; 
    obj.test(); // How can I access the base class 'test()' here?? 
    return 0; 
} 

Donc le code ci-dessus est faux. Vous devez donner:

virtual void test(); 

dans votre classe de base

+1

@ Styne666 S'il vous plaît ne soyez pas impoli dans votre "résumé de montage". C'est visible pour tout le monde. Lisez la [faq] (http://stackoverflow.com/faq#etiquette) - "* La civilité est requise en tout temps, l'impolitesse ne sera pas tolérée *" – jadarnel27

0

Vous pouvez utiliser ceci:

((base)obj).test(); 
Questions connexes