我将shared_ptr用于抽象类ABC。 ABCIMPL类是ABC的实施。 abc_ptr是共享_ptr <abc>指向ABCIMPL对象。在呼叫者函数中,ABC_PTR将在ABC类中调用成员函数之一(func_in_abc)。编译成功。但是,当我使用nm或objdump时,我只能看到abc_ptr的符号。呼叫者函数中的func_in_abc()没有显示符号。

任何人都知道为什么,或者我如何获得呼叫者函数中func_in_abc()符号的输出?

代码如下:在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();

在abcimpl.h中:

#include "ABC.h"

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

在abcimpl.cpp中:

#include "ABCImpl.h"

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

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

在呼叫者功能d.cpp中:

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

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

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

如果我更改abc.h中func_in_abc的定义,则D.CPP的汇编将失败。我认为它会在编译时检查ABC类的定义,但是为什么我找不到呼叫者的符号来映射到ABC中的定义?

有帮助吗?

解决方案

自从 func_in_ABC 是一个虚拟函数,实际上您不需要符号名称来调用它。您只需要在该特定虚拟函数的虚拟表中偏移即可。

如果你做 func_in_ABC 非虚拟的,您应该看到该符号显示在 nm 输出。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top