Comment trouver le symbole de fonction en nm ou objdump lors de l'utilisation shared_ptr pour la classe abstraite?
-
25-10-2019 - |
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
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?
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
.