【问题标题】:How to extend class for which you don't have source code?如何扩展没有源代码的类?
【发布时间】:2015-07-11 18:08:38
【问题描述】:

我有一个问题,我不知道如何开始解决这个问题。 我正在用 C++ 做这个。

假设我们有一些可执行程序(UNIX 平台),我们可以通过键入 my_program 来运行该程序。参数在这里是 4 个类。这些类中的每一个都必须扩展类,即写在目标程序中(在 my_program 中)。

因此,假设在 my_program 中我们有 A、B、C 和 D 类。用户知道他必须扩展这些类,因此他创建了四个子类。

class A1 : public A { ... }
class B1 : public B { ... }
class C1 : public C { ... }
class D1 : public D { ... }

这可能吗? A、B、C 和 D 类在 my_program 中,他能以某种方式扩展它们吗?

【问题讨论】:

  • 不要从他们的类继承,创建一个包含他们类的实例的全新的。组合优于继承等等。
  • 你的意思是这样的? class A1 { A variable; } 然后在程序中我只调用 A.methodName?实际上是非常简洁的解决方案:D 和简单 :)
  • 您可以将可执行文件作为共享对象加载,但这不是一个好主意。只需创建一个共享对象和随附的头文件,让 my_program 和用户程序都加载相同的共享对象

标签: c++ oop c++11 shared-libraries


【解决方案1】:

C++ 不支持这种类型的继承。其他语言,如 C# 允许这样做。

虽然你可以编写这种派生类,但当:

  • 基类的方法(尤其是 ctor/dector)是从 DLL 或 EXE 导出的;
  • 您有带有基类定义的标头;
  • 您使用 DLL 所使用的相同编译器和相同版本的编译器。

在这种情况下,您可以编写包含您的派生类的应用程序。这将是一个单独的二进制文件。它会将该 DLL/EXE 加载到其地址空间中,并在需要时调用基类的方法。这是可能的,因为它们应该被导出,因为这是第一个项目符号中的要求。

【讨论】:

  • 1) 我想你的意思是我创建静态库,然后将该库与该源代码链接? 2)如果我在目标(my_program)class A { void method1() { implementation } void method2() { implementation } }中有这个,如果我给用户一个像这样class A { void method1(); void method2(); }的头文件,那么他可以扩展A类,但是如果他调用A.method1,这个调用方法会从我的目标(我的程序?)
  • 不,我的答案是关于链接二进制文件。静态库的情况不同。你需要这个库和头文件。没有别的了。
  • 好的,让我看看我是否做对了。我必须将我的类(及其所有方法)导出到 lib 文件(.so)并使用我的类(和方法定义)创建头文件并将其提供给用户,以便他可以继承此类 A?
  • 我不太了解基于 Unix 的系统。我知道它有机制,类似于 Windows DLL,但不知道细节。您不能将 C++ 类从二进制文件导出到任何系统中的 lib 文件中。如果将 lib 文件链接到二进制文件中,则无法再取回 .lib 文件。
  • 所以,如果我向用户提供带有基类定义的标题,那么他可以从该类继承,他可以调用方法等等。但是,程序怎么会知道这个类和方法是用二进制实现的呢?我是否需要编译该用户以某种特定方式编写的内容?
猜你喜欢
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多