Question

Peut-être que je me trompe, mais cela semble être une question fondamentale. Tout à coup, ma chaîne d'héritage a cessé de travailler. Rédaction d'une petite application de test de base a prouvé qu'il était moi qui était mal (je ne peux pas blâmer le compilateur).

J'ai une classe de base, avec le comportement par défaut dans une fonction virtuelle. Une classe d'enfants découle de cela et modifie le comportement.

#include <iostream>

class Base
{
public:
    Base() { print(); }
    ~Base() {}

protected:
    virtual void print() { std::cout << "base\n"; }
};

class Child : public Base
{
public:
    Child() {}
    ~Child() {}

protected:
    virtual void print() { std::cout << "child\n"; }
};

int main()
{
    Base b;
    Child c;
}

Cette affiche:

base
base

Quand une instance de l'enfant est créé, pourquoi Base :: print () appelée? Je pensais que, en utilisant le mot-clé virtuelle, la fonction peut être remplacée pour la classe dérivée.

A quel moment je me confonds?

Était-ce utile?

La solution

Vous appelez une méthode virtuelle dans le constructeur, qui ne va pas travailler, comme la classe enfant n'est pas complètement initialisé encore.

Voir aussi cette question StackOverflow.

Autres conseils

Bien que votre problème actuel est l'appel de méthode virtuelle à partir d'un constructeur que d'autres ont dit, j'ai remarqué que vous n'avez pas les Destructeurs virtuel. C'est normalement une mauvaise chose. Dans votre cas, les Destructeurs sont PON et il n'y a pas de membres qui sont des objets avec, ... mais Destructeurs si votre code change alors il est facile pour les mauvaises choses arrivent.

Voir ce lien pour une explication détaillée (pour ne pas appeler des fonctions virtuelles de cteur / dtor).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top