Comment appeler la méthode de la classe dérivée de la classe de base pointeur?

J'ai une classe de structure semblable à la suivante

class A
{
public:
    A(void);
    ~A(void);

    void DoSomething(int i)
    {
        std::cout << "Hello A" << i << std::endl;
    }
};

class B : public A
{
public:
    B(void);
    ~B(void);

    void DoSomething(int i)
    {
        std::cout << "Hello B" << i << std::endl;
    }
};

class Ad : public A
{
public:
    Ad(void);
    ~Ad(void);
};

class Bd : public B
{
public: 
    Bd(void);   
    ~Bd(void);
};

Je veux stocker les instances des classes dérivées dans un récipient (carte standard) comme une collection de Un*, puis itérer sur le récipient et l'appel de méthodes pour chaque instance.

#include "A.h"
#include "B.h"
#include "Ad.h"
#include "Bd.h"
#include <map>
int main(int argc, char** argv)
{
    std::map<int,A*> objectmap;
    objectmap[1] = new Ad();
    objectmap[2] = new Bd();

    for (std::map<int,A*>::iterator itrobject = objectmap.begin();
         itrobject!=objectmap.end(); itrobject++)
    {
        itrobject->second->DoSomething(1);
    }
    return 0;
}

Le code ci-dessus produit la sortie suivante.

Hello A1
Hello A1

Où je m'attendais à

Hello A1
Hello B1

parce que je m'attendais à DoSomething dans B pour masquer DoSomething dans Un, et parce que je suis le stockage Un pointeurs, je m'attends à ce qu'aucun objet de découpage (et en regardant le pointeur d'objet dans le débogueur montre que l'objet n'a pas été tranché).

J'ai essayé en bas de la coulée et de la dynamique de la coulée le pointeur de B, mais il enlève les membres de données de Bd.

Est-il possible d'appeler B::DoSomething sans bouger le pointeur de Bd? Et si non, si j'ai beaucoup de classes dérivées de B (par exemple Bda, Bdb, Bdc etc), est-il un moyen d'utiliser le RTTI pour savoir quelle classe dérivée de le jeter aux?

  • Vous avez besoin de faire pour que la fonction virtual.
  • vous devriez faire de votre commentaire une réponse.
  • Si je fais Un::DoSomething virtuelle, alors j'ai besoin de mettre en œuvre DoSomething dans Ad, correct?
  • Bon appel, a ajouté.
  • J'ai un peu ne comprends pas pourquoi les gens vont à l'effort de taper une question détaillée de ce genre, seulement de le soumettre, avec exactement le même titre que les précédentes itérations. Sont-ils peur de la recherche? stackoverflow.com/questions/15853031/...
  • Non, seulement s'il a été déclaré purement virtuel (parfois appelée "abstraite" dans d'autres langues). Ad est libre d'utiliser l'application fournie par Un si elle n'a pas besoin de sa propre mise en œuvre. Virtuel signifie simplement cette fonction est polymorphe..
  • Désolé, j'ai mal lu votre question. Non, vous n'avez pas à mettre en œuvre des fonctions virtuelles dans chaque sous-classe, si vous ne le faites pas, il vous suffit d'appeler la classe de base de la fonction.

InformationsquelleAutor Ian Thompson | 2013-09-19