Désolé si c'est un dupe, je ne peux pas trouver une réponse tout à fait raison.Résolvez les fonctions virtuelles C++ de la classe de base
Je souhaite appeler une fonction d'un membre de la classe de base et la résoudre vers la version de la sous-classe. Je pensais que le déclarer virtuel le ferait, mais ce n'est pas le cas. Voici mon approche:
class GUIWindow
{
public:
GUIWindow()
{
SetupCallbacks();
}
virtual void SetupCallbacks()
{
// This function always called
}
};
class GUIListbox : public GUIWindow
{
public:
void SetupCallbacks()
{
// This never called
}
};
GUIListbox lb; // GUIWindow::SetupCallbacks is called :(
Qu'est-ce que je fais mal?
Un grand merci
Si
+1. @sipickles, vous appelez la méthode virtuelle du constructeur de la classe de base - c'est-à-dire avant même que la partie dérivée de l'objet ne soit initialisée. Même s'il a fait appel à la méthode du type dérivé, à quoi s'attendriez-vous que le comportement soit avec des parties non initialisées? :) –
Si c'est ce que le livre dit réellement, alors l'endroit pour ce livre est la poubelle. Ce que le livre semble suggérer, c'est que «vous êtes trop stupide pour apprendre comment cela fonctionne, alors ne le faites jamais». En réalité, le conseil approprié devrait être "Apprenez, comment les fonctions virtuelles fonctionnent pendant la construction et comment les utiliser correctement". Fonction virtuelle * faire du travail * pendant la construction, mais avec quelques détails. – AnT
Ack, merci. C'est évident maintenant! Il est temps de relire mes manuels! – sipi