Ne supprimez travailler avec des pointeurs de classe de base?

Avez-vous à transmettre supprimer le pointeur de même a été renvoyé par le nouveau, ou vous pouvez passer un pointeur à l'une des classes de types de base? Par exemple:

class Base
{
public:
    virtual ~Base();
    ...
};

class IFoo
{
public:
    virtual ~IFoo() {}
    virtual void DoSomething() = 0;
};

class Bar : public Base, public IFoo
{
public:
    virtual ~Bar();
    void DoSomething();
    ...
};

Bar * pBar = new Bar;
IFoo * pFoo = pBar;
delete pFoo;

Bien sûr, cela est grandement simplifiée. Ce que je veux vraiment faire est de créer un conteneur plein de boost::shared_ptr et de le passer à un code qui supprime le conteneur quand il est fini. Ce code ne saura rien de la mise en œuvre de la Barre ou de la Base, et va s'appuyer sur l'implication d'un opérateur d'effacement dans le shared_ptr destructeur de faire la bonne chose.

Cela peut-il travailler? Mon intuition me dit non, car les pointeurs n'aura pas la même adresse. D'autre part, un dynamic_cast<Bar*> devrait fonctionner, donc quelque part le compilateur est de stocker assez d'informations pour comprendre.


Merci pour l'aide, tout le monde qui a répondu et commenté. Je connaissais déjà l'importance de virtuel destructeurs, comme le montre mon exemple; après avoir vu la réponse que j'ai donné un peu de réflexion, et a réalisé le raison pour un destructeur virtuel est ce scénario exact. Ainsi, il a dû travailler. J'ai été jeté par l'absence de moyens visibles de convertir le pointeur vers l'original. Un peu plus de réflexion m'a amené à croire qu'il y avait un des moyens invisibles, et je pense que le destructeur est le retour de la vraie pointeur pour supprimer la libération. Enquête sur le code compilé à partir de Microsoft VC++ a confirmé mes soupçons quand j'ai vu cette ligne dans ~Base:

mov eax, DWORD PTR _this$[ebp]

Retraçant l'assembleur a révélé que c'était le pointeur passé à la fonction de suppression. Mystère résolu.

J'ai fixé l'exemple pour ajouter le destructeur virtuel à IFoo, c'était une simple surveillance. Merci encore à tous ceux qui l'a signalé.

InformationsquelleAutor Mark Ransom | 2008-11-17