2014-11-29 3 views
0

클래스에 가상 인터페이스를 내보내는 DLL이 있습니다. 해당 인터페이스를 상속하지만 DLL에서 기능을 유지하고 싶습니다.DLL에서 가상 클래스 인터페이스 가져 오기 (C++)

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); 
} 

가 어떻게에서 (IClassA을 상속 할 수 있습니다 foo() 및 bar()를 재정의하지 않고 (DLL을 포함하는 프로젝트) (이후 내 프로젝트에서는 가능하지 않을 것입니다) ClassA insead에 정의 된 es?

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() 메소드가 있습니다.

+2

'foo'와'bar'는 순수 가상 멤버 함수를. 'ClassB' _must_는 그 함수를 정의해야합니다. 그렇지 않으면 인스턴스화 할 수 없습니다. 'ClassA'에서 기능을 상속 받으려면'IClassA' 대신에'class'에서 파생해야합니다. –

+0

ClassB는 생성자에서 new_IClassA()를 호출하고 단순히 IClassA-> foo 및 bar를 호출하는 foo 및 bar를 구현해야합니다. 집계라고하는 일종의 구성은 매우 기계적이지만 컴파일러의 도움을받지 못합니다. –

답변

0

How can I inherit IClassA without redefining the foo() and bar() and using the ones defined in ClassA instead?

대답은 다음과 같습니다 당신이 수 없습니다.

모든 구현은 foo()bar()을 구현해야합니다. 당신이 ClassA::foo()ClassA::bar()의 구현을 재사용 ClassB을 원하는 경우에

, 다음, 당신은 (IClassA 그대로) ClassA이 당신의 DLL에서 내보낼 수 있고 ClassBClassA (보다는 IClassA)에서 파생되어 있어야합니다.

class EXPORT ClassA : public IClassA { 
    ... 
}; 

그런 다음 직접 ClassA 개체를 만들 수 있습니다 당신의 DLL을 사용하는 사람들로 EXPORT IClassA* new_IClassA(int a, int b);을 제거 고려할 수 있습니다.

편집 :

한스 옆모습에 의해 주석 (내가 밤새 그것에 대해 생각 나는 commanet ;-)보고이 편집을 추가하려고했다으로

: ClassAfoo()bar() 코드가 복잡한 경우를 정말로 재사용하고 싶다면 ClassBClassA 속성을 유지해야합니다. ClassBfoo()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; 
}; 
관련 문제