从DLL继承虚拟类接口(C ++)

时间:2014-11-29 19:04:53

标签: c++ inheritance dll

我有一个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()。

1 个答案:

答案 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导出ClassAIClassA是{并且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必须实施ClassBfoo(),但不需要复制bar()的代码:

ClassA