从共享库中加载方法,该方法调用在子类中实现的方法

时间:2015-07-22 18:45:15

标签: c++ linker shared-libraries static-libraries

我知道标题有点令人困惑,但让我解释一下:

我有这样的A级:

class A : public Parent
{
public:
    //other methods and stuff
    void run() 
    {
         execute(arr, size_of_array);
    }

    virtual void execute(int tab[], int size) = 0;
};

我有实现此方法的B类执行如下:

class B : public A
{
public:
    void execute(int tab[], int size)
    {
        //do something here
    }
};

B类在静态库中,A类在动态库中。 在主程序中,我想加载符号“run”并调用此方法,以便此方法将从该静态库调用execute函数。这可能吗? 我想我需要以某种方式将这个静态库链接到共享库,这样就不会有任何未定义的引用?

我有点卡在这里所以我会感激任何帮助。感谢

1 个答案:

答案 0 :(得分:1)

简短的回答:它按照你想要的方式工作。

答案很长:B类是在静态库中定义的。如果你有一个B类实例,那么它就是在静态库中创建的,或者是链接到静态库的东西。

因为这个类有一个虚方法,所以每个实例都包含一个指向vtable的指针(一个隐藏的指向虚拟方法实际实现的指针表)。这个vtable是在静态库中生成的,指针在实际的B中生成对象指向它。因此,当类A中的方法调用execute时,它通过对象本身中的指针找到vtable,并通过偏移调用vtable进入vtable。因此,它在静态lilbrary中使用vtable,最终在静态库中定义的execute方法中。