C++ méthode Substituée pas appelé
Forme.h
namespace Graphics {
class Shape {
public:
virtual void Render(Point point) {};
};
}
Rect.h
namespace Graphics {
class Rect : public Shape {
public:
Rect(float x, float y);
Rect();
void setSize(float x, float y);
virtual void Render(Point point);
private:
float sizeX;
float sizeY;
};
}
struct ShapePointPair {
Shape shape;
Point location;
};
Utilisée comme ceci:
std::vector<Graphics::ShapePointPair> theShapes = theSurface.getList();
for(int i = 0; i < theShapes.size(); i++) {
theShapes[i].shape.Render(theShapes[i].location);
}
Ce code finit par appeler Shape::Render
et pas Rect::Render
Je suppose que c'est parce que c'est un moulage de la Rect
à un Shape
, mais je n'ai aucune idée de comment faire pour arrêter cela. Je suis en train de laisser chaque forme de contrôle de la manière dont elle est rendue par des raisons impérieuses le Render
méthode.
Des idées sur la façon de réaliser cet objectif?
Peut-être que vous voulez nous montrer le code qui crée les éléments du vecteur?
Le problème et la solution sont presque identiques à ce stackoverflow.com/questions/1230006 question. Comme là-bas, vous avez un vecteur de (struct containting un béton de classe de base, vous devez créer par découpage les classes dérivées si vous attendez Rect::Render pour être appelé.
Le problème et la solution sont presque identiques à ce stackoverflow.com/questions/1230006 question. Comme là-bas, vous avez un vecteur de (struct containting un béton de classe de base, vous devez créer par découpage les classes dérivées si vous attendez Rect::Render pour être appelé.
OriginalL'auteur Simon Moles | 2009-09-18
Vous devez vous connecter pour publier un commentaire.
Est là votre problème:
Vous stockez une
Shape
. Vous devez stocker unShape *
, ou unshared_ptr<Shape>
ou quelque chose. Mais pas unShape
; C++ n'est pas Java.Lorsque vous affectez une
Rect
à laShape
, seul leShape
partie est en cours de copie (c'est objet de découpage).a noté, ta.
Merci. J'espérais pouvoir le faire sans les pointeurs car les formes ne pas utiliser beaucoup de mémoire sont donc simples pour copier autour de sur la pile, mais il semble que ce n'est pas possible. Merci à tous pour les réponses rapides.
OriginalL'auteur dave4420
Ce problème est appelé le découpage - vous perdez la dérivée de la fonctionnalité lors de la copie d'une base.
Pour éviter cela, utiliser des pointeurs de la classe de base, c'est à dire
OriginalL'auteur Georg Fritzsche
Le problème est que dans votre vecteur de stocker des copies d'objets de Forme, et de la copie d'un objet de Forme ne copie pas les données ou les fonctionnalités de ses classes dérivées - vous êtes découpage le polymorphisme loin.
Gérer les objets à l'aide de nouveaux et de les supprimer et de les organiser votre vecteur de stocker des pointeurs vers eux.
OriginalL'auteur moonshadow
Le polymorphisme ne fonctionnent qu'à partir d'un pointeur vers une forme, non pas à partir d'un objet de forme.
OriginalL'auteur Locksfree
Vous accédez à la forme de l'objet directement pour le remplacement de travailler vous avez besoin pour accéder à l'objet par l'intermédiaire d'un pointeur ou une référence.
Par exemple lorsque vous attribuer la Forme dans la ShapePointPair le code "tranche" de l'objet et ne copie que la Forme de bits dans le ShapePointPair
Cela signifie que vous devez regarder à la gestion de mémoire de sorte que vous pourriez utiliser un pointeur intelligent de la struct
ShapePointPair {
smart_pointer forme;
Emplacement du Point;
};
OriginalL'auteur Mark
Non, il n'est pas de la coulée.
La place, vous pouvez stocker une référence à baseclass Point:
Cette référence doit être définie au moment de la construction de struct
ShapePointPair. Ajouter un constructeur à ShapePointPair pour cette
but. Il doit être passé (nouvellement créé) des cas d'
Rect.
Également observer la gestion de la mémoire des responsabilités (bon
écrit destructeurs, etc.).
OriginalL'auteur Peter Mortensen
Vous pouvez essayer de boost::ptr_vector
http://www.boost.org/doc/libs/1_40_0/libs/ptr_container/doc/ptr_container.html
OriginalL'auteur Chris Bednarski
Je ne suis pas sûr de bien expliquer à cause de mon anglais est pauvre.
Je pense que vous devriez avoir à l'utiliser de référence ou un pointeur de type.
parce que la forme est défini exactement ce qu'il a à faire.
Si vous utilisez votre code directement de votre enfant, essayez de le copier et de le faire de la forme de travail.
C'est pourquoi, ne fonctionne pas votre fonction override.
utilisation de pointeur ou de référence
comme cette.
pointeur.h
de référence.h
*ps: personnellement j'ai utiliser la fonction abstraite(virtual void truc() = 0;).
parce que j'ai aussi oublié parfois si je peux l'attraper comme une erreur de syntaxe.
OriginalL'auteur James