Comment trouver le symbole de fonction en nm ou objdump lors de l'utilisation shared_ptr pour la classe abstraite?

StackOverflow https://stackoverflow.com/questions/6805923

Question

J'utilise shared_ptr pour un ABC de classe abstraite. classe ABCImpl est la mise en œuvre de ABC. abc_ptr est un shared_ptr Points à un objets ABCImpl. En fonction de l'appelant, abc_ptr appellera une des fonctions de membre (func_in_ABC) en classe ABC. La compilation réussit. Mais quand je l'utilise nm ou objdump, je ne pouvais voir le symbole de abc_ptr. Il n'y a pas de symbole affiché pour func_in_ABC () dans la fonction de l'appelant.

Tout le monde sait pourquoi, ou comment un je reçois la sortie pour le symbole de func_in_ABC () dans la fonction de l'appelant?

Le code est le suivant: En ABC.h:

#include <boost/shared_ptr.hpp>

class ABC
{
    public:
        virtual void func_in_ABC(const int param) = 0;
};

typedef boost::shared_ptr<ABC> ABCPtr;
ABCPtr get_ABC_ptr();

En ABCImpl.h:

#include "ABC.h"

class ABCImpl : public 
{
    public:
        ABCImpl() {}
        void func_in_ABC(const int param);
    private:
        int data;
};

En ABCImpl.cpp:

#include "ABCImpl.h"

ABCPtr get_ABC_ptr()
{
        return ABCPtr(new ABCImpl());
}

void ABCImpl::func_in_ABC(const int param)
{
    data = param;
}

En fonction de l'appelant D.cpp:

#include "D.h"
#include "ABC.h"

void D::call_ABC()
{
    ABCPtr abc_ptr = get_ABC_ptr();
    abc_ptr->func_in_ABC(100);
}

La sortie de D.o nm:

         U _Unwind_Resume
         U get_ABC_ptr()
0000000000000000 T D::call_ABC()
0000000000000000 W boost::shared_ptr<ABC>::operator->() const
0000000000000000 r boost::shared_ptr<ABC>::operator->() const::__PRETTY_FUNCTION__
         U __assert_fail
         U __gxx_personality_v0

Si je change la définition de func_in_ABC dans ABC.h, la compilation pour D.cpp échouera. Je pense qu'il va vérifier la définition de ABC de la classe lors de la compilation D.O. Mais pourquoi je ne peux pas trouver le symbole à l'appelant à la carte à la définition dans ABC?

Était-ce utile?

La solution

Depuis func_in_ABC est une fonction virtuelle, vous ne devez pas vraiment le nom de symbole pour l'appeler. Vous avez juste besoin le décalage dans la table virtuelle pour cette fonction virtuelle spécifique.

Si vous faites non virtuelle func_in_ABC, vous devriez voir le symbole apparaître dans la sortie nm.

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