从调用 children class 中实现的方法的共享库加载方法

Load method from shared library which calls method that is implemented in children class

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

我有 class 个这样的:

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

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

我有 class B 实现了这个方法,像这样执行:

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

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

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

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

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

因为这个 class 有一个虚方法,每个实例都包含一个指向 vtable 的指针(一个隐藏的 table 指向虚方法实际实现的指针。)这个vtable在静态库中生成,实际B对象中的指针指向它。因此,当 class A 中的方法调用执行时,它通过对象本身中的指针找到 vtable,并通过 vtable 中的偏移量调用该方法。因此,它在静态库中使用 vtable,并在静态库中定义的执行方法中结束。