Appel de méthode de la classe dérivée de la classe de base de référence
class Material
{
public:
void foo()
{
cout << "Class Material";
}
};
class Unusual_Material : public Material
{
public:
void foo()
{
cout << "Class Unusual_Material";
}
};
int main()
{
Material strange = Unusual_Material();
strange.foo(); //outputs "Class Material"
return 0;
}
Je voudrais que cette de suite dans la "Classe Unusual_Material" affiché sur la console. Est-il un moyen que je peux accomplir cela? Dans mon programme j'ai une classe de matière à partir de laquelle d'autres plus spécifiques des matériaux sont dérivés. La méthode Matériel::foo() représente une méthode de Matériau qui est suffisant pour la plupart des matériaux, mais occationally, un autre foo() doit être défini pour un matériau avec des propriétés inhabituelles.
Tous les objets dans mon programme contient un champ de Matériau. Dans le cas où ils sont affectés à un matériau inhabituel, je voudrais la dérivée, inhabituel foo être appelé.
C'est probablement assez facile, voire impossible, mais je ne peux pas le comprendre de toute façon.
Grâce
Material strange = Unusual_Material();
peut entraîner l'objet de découpage problème: stackoverflow.com/questions/274626/...OriginalL'auteur user487100 | 2010-11-17
Vous devez vous connecter pour publier un commentaire.
Ce que vous voulez, c'est le polymorphisme, et de l'activer pour une fonction, vous devez faire
virtual
:Aussi, le polymorphisme ne fonctionne que pour les références et les pointeurs:
Ce que vous avez dans votre extrait de code trancher le
Unusual_Material
de l'objet:Ce n'est pas grave, tant que vous vous rendez compte ce qui s'est passé. Je ne vous recommandons de récupérer une bonne C++ livre cependant, car il traite de ce sujet fondamental dans beaucoup plus de détails.
Et je n'avais aucune idée sur le découpage. Je pensais que le programme serait juste de ne pas avoir accès aux pièces dérivées, mais je suppose que, lorsque vous n'utilisez pas un renvoi, ce qui rend beaucoup de sens. Merci pour l'ajout que peu à la fin pour mon édification.
Il a à voir avec le fait que vous ne pouvez pas "digne" d'un objet d'une classe dérivée en un objet d'une classe de base, depuis la classe dérivée sera presque toujours plus de données des membres. Dans un sens, vous n'avez pas accès à la pièce dérivée, parce que ces pièces dérivées ont été coupés pour que le compilateur puisse affecter un objet de classe dérivée d'une classe de base de l'objet.
Toutefois, des pointeurs et des références sont de la même taille, peu importe si elles sont des pointeurs vers une classe dérivée ou d'une classe de base, de sorte que vous n'obtenez pas de trancher des problèmes à l'aide des pointeurs et des références.
OriginalL'auteur In silico
Encore meilleure explication serait..
OriginalL'auteur Avinash Goud N J