我有一个DLL,它将虚拟接口导出到一个类。我想继承该接口,但保留DLL的功能。
DLL.h(我用来包含DLL的头文件)
#ifndef EXPORT
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif
class EXPORT IClassA {
public:
virtual int foo() = 0;
virtual int bar() = 0;
};
EXPORT IClassA* new_IClassA(int a, int b);
Internal.h
#include "DLL.h"
class ClassA : public IClassA {
public:
ClassA(int a, int b);
int foo();
int bar();
private:
int a;
int b;
};
DLL.cpp
#include "internal.h"
ClassA::ClassA(int a, int b) { this->b = b; this->a = a; }
int ClassA::foo() { return a; }
int ClassA::bar() { return b; }
IClassA* new_IClassA(int a, int b) {
return new ClassA(a, b);
}
如何在不重新定义foo()和bar()的情况下继承IClassA(在包含DLL的项目中)(因为在我的项目中这是不可能的)并使用ClassA insead中定义的那些?
e.g。
class ClassB : public IClassA {
public:
// I have no idea how to make a suitable constructor
int baz() { return c };
private:
int c;
}
现在ClassB的方法有foo(),bar()和baz()。
答案 0 :(得分:0)
How can I inherit IClassA without redefining the foo() and bar() and using the ones defined in ClassA instead?
答案是:你不能。
IClassA
的任何实施都必须实施foo()
和bar()
。
如果您希望ClassB
重复使用ClassA::foo()
和ClassA::bar()
的实施,那么您必须从您的dll导出ClassA
(IClassA
是{并且ClassB
派生自ClassA
(而不是IClassA
)。
class EXPORT ClassA : public IClassA {
...
};
然后,您可以考虑删除EXPORT IClassA* new_IClassA(int a, int b);
,因为使用您的dll的人可以直接创建ClassA
个对象。
编辑:
由 Hans Passant评论(我在一夜之间想到了它,当我看到commanet的时候即将添加这个编辑;-):如果ClassA
的{{1} }和foo()
代码很复杂,如果您真的想重复使用它们,那么bar()
保持ClassB
属性。 ClassA
必须实施ClassB
和foo()
,但不需要复制bar()
的代码:
ClassA