2010-11-11 3 views

Répondre

6

Oui.

Il suffit de faire la méthode de base virtual.
C++ n'a pas de mot-clé override; toute méthode ayant la même signature (y compris les types de paramètre et const -ness) en tant que méthode de base virtual l'écrasera.

+2

Vous n'avez pas besoin de faire un classe de base virtuelle. Une fonction de classe de base virtuelle vous permet d'utiliser correctement le polymorphisme. Normalement, vous pouvez simplement remplacer la fonction de classe de base, mais dites que vous avez un tableau de pointeurs d'objet 'shape', vous pouvez utiliser un élément dérivé de cet élément, comme 'square' ou 'triangle' si vous appelez une fonction Comme draw() il appellera normalement le dessin de la classe de base, à moins qu'il ne soit virtuel, alors il regardera quel type est réellement pointé par le tableau et appellera la fonction de la classe dérivée – thecoshman

+1

@thecoshman: Il demande l'équivalent de C# 's mot-clé 'override' (polymorphisme), pas le mot-clé' new' de C# (masquage). Pour cela, vous avez besoin de 'virtual'. (même s'il ne comprend pas la distinction) – SLaks

+0

Eh bien, si vous regardez strictement que le mot-clé 'override' en C# n'est simplement pas nécessaire en C++, il est simplement implicitement impliqué par le fait que les deux fonctions ont la même signature . – thecoshman

0

Oui, vous pouvez remplacer les méthodes de classe de base; Si vous utilisez le mot-clé virtual dans votre classe de base, la liaison de la méthode sera dynamique (c'est-à-dire entièrement polymorphique); Si vous n'utilisez pas le mot-clé virtual dans votre classe de base, la liaison de la méthode sera statique.

+0

Il ne sera pas _fully_ dynamique; les surcharges (types de paramètres) seront sélectionnées au moment de la compilation. – SLaks

+0

Slaks: vrai dat. –

3

Seulement en C++ 0x, le prochain standard à venir du langage C++. En C++ 03, c'est le C++ courant que vous remplacez implicitement, c'est-à-dire que vous ne marquez pas explicitement la méthode redéfinie comme une substitution. Mais attention, si vous écrivez accidentellement une autre signature mais le même nom, la fonction de la classe de base sera cachée et non remplacée!

struct X 
{ 
    virtual void f() {...}; 
}; 

struct Y:X 
{ 
    void f() {...} //overrides X::f 
}; 

struct Z:X 
{ 
    void f() const {... } //hides X::f!!! 
}; 

La seule chose qui peut différer dans les déclarations de fonctions est que, si dans la classe de base, la fonction retourne T1* (ou T1&) et dans la classe dérivée T2* (ou T2&) et T2 est dérivé de T1, alors il est bon , il est encore en train de se couvrir, pas de se cacher. HTH

0

Beaucoup de réponses ont dit que vous faites une fonction de classe de base virtual, cela est souvent fait mais pas nécessaire. vous pouvez simplement faire ce qui suit ...

class A{ 
public: 
void foo(); 
} 
class B: public A{ 
public: 
void foo(); 
} 
class C: public A{ 
public: 
void foo(); 
} 

Si vous aviez un tableau de pointeurs tels que A* basePTR[2] vous pouvez par exemple basePTR[0] comme une instance de B alors basePTR[1] comme une instance de C. mais si vous avez essayé d'appeler basePTR[0]->foo() vous appellerez A::foo()

si vous avez défini A comme

class A{ 
public: 
virtual void foo(); 
} 

puis en appelant basePTR[0]->foo() appellera B::foo()

Leur est en tête pour utiliser cette fonctionnalité au moment de l'exécution d'un coup d'oeil Il faut faire pour voir si vous appelez les fonctions de base foo() ou foo() d'une classe dérivée mais normalement, cette fonctionnalité vaut le coup de performance relativement mineur.

Vous pouvez définir A comme

class A{ 
public: 
virtual void foo() =0; 
} 

le =0 à la fin de foo() signifie que cette fonction est une fonction virtuelle pure, cela signifie qu'il doit être défini par une classe dérivée et vous ne pouvez pas créer une instance de A. Un bon exemple d'où vous utiliseriez ceci serait dans un jeu, vous pourriez avoir une classe de base GameToken qui a une position XYZ et une fonction virtuelle pure dessiner et mettre à jour.de cela, vous pouvez tirer playerAIdynamicObject etc ... votre moteur pourrait alors simplement stocker un tableau de type GameToken* et itérer ce tableau appelant draw() et update() pour tous les différents types dans le tableau

+0

'virtual' est nécessaire car' override' dans C# * signifie * polymorphisme –

Questions connexes