C++ 从DLL(C+;+;)中内置虚拟类接口

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

我有一个将虚拟接口导出到类的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::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;
};