从库类扩展,然后如何使库调用派生类方法

哈里森·文斯

我想知道这是否可能。同样,问题是:

如何从库类扩展,然后让库在派生类中调用函数?

显然,在编写使用继承的代码之前,该库已经构建/编译(如下所示,显示为DerivedClass)。我想尽可能地远离用户。为此,我进行了以下设置(为简单起见,省略了以下内容):

LibraryClass是我创建的.lib中的类。

LibraryClass.h
class LibraryClass{
public:
    virtual void MyMethod() { }
};

DerivedClass继承自该库:

DerivedClass.h
Class DerivedClass: public LibraryClass {
public:
    virtual void MyMethod();
};

如果我在DerivedClass源文件中定义MyMethod,如下所示:

DerivedClass.cpp
void DerivedClass::MyMethod() {
    cout << "it works!" << endl;
}

库是否可以调用派生类的方法?我以为将DerivedClass对象作为指针传递给库,但是该库无权访问包含它的标头,因为它已被编译到.lib中。

我以前曾经看过(Urho3D),他们使用黑魔法还是想念一些简单的东西?

戴维斯鲱鱼

这正是动态调度(在C ++中称为virtual)所做的事情:给定Base*(或Base&)引用派生类型的对象,即使没有任何声明,对虚拟函数的调用也会找到重写Derived(因此,即使调用是“先编译”)。

关于您的“库提供的main”想法,要难得多:总的来说,他的库将如何知道如何构造您的对象,如果您链​​接两个“扩展类”,它将做什么

但是可能的是,如果库为它设计:让该库提供一个全局指针变量(main如果您要使用默认值,this则将其分配给它),并让扩展类的构造函数分配给它。然后,只需定义该类类型的全局对象即可。如果不需要默认行为,也可以在库中声明并调用而不是定义初始化函数,然后将其留给扩展名来定义它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章