C++ 使库函数使用从库类派生的类

C++ 使库函数使用从库类派生的类,c++,dll,polymorphism,vtable,C++,Dll,Polymorphism,Vtable,我有一个.dll,我可以自己构建。我有一个类,Lion,它派生自库中的一个类,Cat,它重写了一个虚拟函数,Leap()。我想创建一个类型为Lion的对象,将其传递给需要类型为Cat的库函数,这样,当它们调用Cat->Leap()时,它们会使用过度的虚拟函数Lion->Leap() 这有可能吗 到目前为止,我所尝试的一切都以忽略重写的函数而告终。我猜这是因为在编译库时,它解决了如何解析对Leap()的调用,此时我的派生类型不存在。或者,因为库引用的对象类型为Cat(实际上是Lion),所以它调用

我有一个.dll,我可以自己构建。我有一个类,
Lion
,它派生自库中的一个类,
Cat
,它重写了一个虚拟函数,
Leap()
。我想创建一个类型为
Lion
的对象,将其传递给需要类型为
Cat
的库函数,这样,当它们调用
Cat->Leap()
时,它们会使用过度的虚拟函数
Lion->Leap()

这有可能吗

到目前为止,我所尝试的一切都以忽略重写的函数而告终。我猜这是因为在编译库时,它解决了如何解析对
Leap()
的调用,此时我的派生类型不存在。或者,因为库引用的对象类型为
Cat
(实际上是
Lion
),所以它调用
Cat::Leap()
,而不是
Lion::Leap()

我认为函数是虚拟的这一事实意味着,即使它是从库中调用的,它也会通过在运行时查看对象的vtable来解决调用问题,而vtable就是派生类型的vtable


谢谢。

为了使其工作,库需要以某种方式编写:它应该通过引用或指针而不是通过值(不幸的是,这是在C++中传递参数的默认方式)获取其
Cat
s。如果您将
Lion
传递给一个按值需要
Cat
的函数,则
Lion
将到达
Cat
,并就函数而言有效地成为
Cat

虚拟函数启用在运行时确定的动态/延迟绑定。因此,您不必担心编译时决策会像这样影响代码

只要函数在基类中是虚拟的,它在派生类中被重写,并且库函数通过常量引用或指针调用,那么无论类定义在何处,它都可以正常工作

很有可能你正在分割你的对象,最后只剩下基类的一半,因为你是通过值而不是指针或引用来传递的

你可以这样想:


如果我将一头狮子作为猫传入,根据值,它将复制该狮子所铸入的“猫”。该副本将被使用,但副本只是猫的一半,因此它不可能发送到狮子的一半-它不存在于副本中。这些函数和数据成员根本不在其中。通过引用或指针传递可确保您仍然可以使用整个原始lion对象。

在库的头文件中声明虚拟跳跃:

class Cat {
public:
  virtual void leap() const { /* ... */ };
  /// ...
};
并通过在库源代码中传递引用或指针来使用
Cat
s:

void LibraryUsesCat(const Cat*c)
{ c-> leap(); }
在应用程序中,覆盖虚拟功能:

class Lion : public Cat {
public:
  void leap() const { /* ... */ }
  /// ...
};

这应该是可行的。

发布您想要调用的库函数的函数原型。切片狮子是危险的,不要在家里尝试。没有动物受到伤害®来产生这个答案。哈哈,很好的评论。。。你打败了我,+1:)