从调用 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,并在静态库中定义的执行方法中结束。
我知道这个标题有点令人困惑,但让我解释一下:
我有 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,并在静态库中定义的执行方法中结束。