【问题标题】:Load method from shared library which calls method that is implemented in children class从共享库加载方法,该方法调用在子类中实现的方法
【发布时间】:2015-07-22 18:45:14
【问题描述】:

我知道标题有点混乱,但让我解释一下:

我有这样的 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”并调用此方法,以便此方法将从该静态库中调用执行函数。这可能吗? 我想我需要以某种方式将此静态库链接到共享库,这样就不会有任何未定义的引用?

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

【问题讨论】:

  • run 是一个非静态成员函数,需要A 的实例才能调用。

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


【解决方案1】:

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

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

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

【讨论】:

  • "如果你有一个类 B 的实例,那么它是在静态库中创建的,或者是链接到静态库的东西。"你的意思是如果我的主程序中有 B 类的实例?首先,这个静态库没有与主程序链接。这是完全独立的程序/项目。所以,在我的主程序中,我只有方法的定义。我知道由于该虚拟执行方法,我不能拥有 A 类的实例。让我们尝试另一种方式。如果我有共享库而不是静态库会更简单吗?
  • 我相信我可以将lib文件加载到main中,创建B类的实例,我可以在B类上调用方法执行,因为B类继承了A类?
  • 这不是 Java(或任何其他解释型语言) 没有类加载器之类的东西。创建 B 时,必须拥有 B 的声明,这意味着如果 B 在静态库中声明,则只能在静态库或已链接到静态库。
  • 必须“手动”加载动态库的情况极为罕见。这会自动为您发生,因为您的代码与库链接。
  • 因此,我无法将静态库(其中为 B 类)链接到我的主程序。让我解释一下我在做什么。我正在做测试算法的程序。我有程序 my_program ,它是主程序。用户可以安装这个程序,然后他可以创建项目。让我们看看他用 BubbleSort 算法创建了排序项目。这个execute方法实际上是一个ob BubbleSort的实现。那么,您认为最好的方法是什么?我可以使用 B 类创建共享库,然后创建 B 类的实例并调用运行吗?
猜你喜欢
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
相关资源
最近更新 更多