C++ 从DLL(C+;+;)中内置虚拟类接口
我有一个将虚拟接口导出到类的DLL。我希望继承该接口,但保留DLL中的功能 h(我用来包含DLL的头文件) 内部C++ 从DLL(C+;+;)中内置虚拟类接口,c++,inheritance,dll,C++,Inheritance,Dll,我有一个将虚拟接口导出到类的DLL。我希望继承该接口,但保留DLL中的功能 h(我用来包含DLL的头文件) 内部 #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::Clas
#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);
}
我如何继承IClassA(在包含DLL的项目中)而不重新定义foo()和bar()(因为在我的项目中这是不可能的)并使用ClassA insead中定义的
e、 g
现在ClassB有了foo()、bar()和baz()方法。
我如何继承IClassA而不重新定义foo()和bar()并使用ClassA中定义的方法呢?
答案是:你不能
任何IClassA
的实现都必须实现foo()
和bar()
如果希望ClassB
重用ClassA::foo()
和ClassA::bar()
的实现,则必须从dll导出ClassA
(如IClassA
原样),并从ClassA
派生ClassB
(而不是IClassA
)
然后,您可以考虑删除<代码>导出ICLASA*NeWixICLASA(int a,int b);<代码>因为使用dll的人可以直接创建
ClassA
对象
编辑:
正如Hans Passant所评论的(当我看到commanet时,我想了一晚上,正要添加这个编辑;-):如果ClassA
的foo()
和bar()
代码很复杂,如果你真的想重用它们,那么,让ClassB
维护一个ClassA
属性ClassB
必须实现foo()
和bar()
,但不需要复制ClassA
的代码:
class ClassB : public IClassA {
public:
ClassB( int _a, int _b, int _c ) : pA( new_IClassA( _a, _b ) ), c( _c ) {}
~ClassB() { delete pA; }
int foo() { return pA->foo(); }
int bar() { return pA->bar(); }
int baz() { return c };
private:
ClassA* pA;
int c;
};
foo
和bar
是纯虚拟成员函数ClassB
必须定义这些函数。如果没有,则无法实例化它们。如果您想从ClassA
继承功能,您需要从该类派生,而不是从IClassA
派生。ClassB需要在其构造函数中调用new_IClassA(),并实现foo和bar,它只需调用IClassA->foo和bar。一种称为聚合的组合,它非常机械,但您无法从编译器获得帮助。
class ClassB : public IClassA {
public:
// I have no idea how to make a suitable constructor
int baz() { return c };
private:
int c;
}
class EXPORT ClassA : public IClassA {
...
};
class ClassB : public IClassA {
public:
ClassB( int _a, int _b, int _c ) : pA( new_IClassA( _a, _b ) ), c( _c ) {}
~ClassB() { delete pA; }
int foo() { return pA->foo(); }
int bar() { return pA->bar(); }
int baz() { return c };
private:
ClassA* pA;
int c;
};