2014-12-09 3 views
1

안녕하세요 저는 C++과 C#을 섞어 놓은 프로젝트에서 상속에 관한 질문이 있습니다. 그래서 C + +/CLI 레이어 inbetween 물건을하고있다. 관리되는 클래스와 관리되지 않는 클래스 간의 상속

public Class A : 
{ 
public : 
A(){*a = new int(); *a = 0;} 
void f1(){*a = 10}; 
int geta(){return *a}; 
private : 
int *a; 
} 

public Class B : public A 
{ 
public : 
B(){*b = new int(); *b = 0;} 
void f2(){*b = 5; *a = 10}; 
int getb(){return *b}; 
int getinheriteda(){return *a;}; 
private : 
int *b 
} 

그런 다음 C++/CLI에, 나는 그들의 관리 버전 2 개 SAMES 클래스를 가지고 : C에서 는 ++ 나는이 개 구조를 가지고있다. 각 개체는 관리되지 않는 C++ 클래스에 대한 포인터를 소유합니다.

public ref Class ANet : 
{ 
public : 
ANet(){ un_a = new A();} 
~ANet(){ this->!ANet();} 
!ANet(){ delete un_a;} 
void f1Net(){ un_a->f1();} 
int getanet(){return un_a->geta();} 
private: 
A *un_a; //Pointer to the unmanaged A 
} 

버전 1 :

public ref Class BNet : public Class ANet: 
{ 
public : 
BNet(){ un_b= new B();} 
~BNet(){ this->!BNet();} 
!BNet(){ delete un_b;} 
void f2Net(){ ((B*)un_a)->f2();} 
int getbnet(){return un_b->getb();} 
int getinheriteda(){return un_b->getinheriteda();}; 
private: 
B *un_b; //Pointer to the unmanaged B 
} 

버전 2 :

public ref Class BNet : public Class ANet: 
{ 
BNet(){ un_a = new B();} 
~BNet(){ this->!BNet();} 
!BNet(){ delete un_a;} 
void f2Net(){ ((B*)un_a)->f2();} 
int getbnet(){return((B*)un_a)->getb();} 
int getinheriteda(){return ((B*)un_a)->getinheriteda();}; 
private: 
//No pointer, use inherited un_a; 
} 

문제 :

버전 1 : 나는 B의 인스턴스를 얻을 경우, 나는 (un_b 두 개의 포인터를 가지고 상속 된 un_a) 그래서 각 포인터가 관리되지 않는 클래스의 결과 불일치가 발생했습니다.

버전 2 : 그 두 관리되지 않는 클래스를 포장 할 수있는 관리되는 C++/CLI 구조를 구현할 수있는 방법

불일치

의 결과로 두 번 만들어 내가 B의 인스턴스를 얻는 경우에, 나는 하나의 포인터를했지만. 어떤 아이디어? 필요한 경우

public ref class ANet 
{ 
... 
protected: 
    ANet(A* a) : un_a(a) { ... } 
... 

public ref class BNet : public ANet 
{ 
public: 
    BNet() : ANet(new B()) { ... } 
... 

닷넷에서 당신은 또한 관리되지 않는 인스턴스를 만들 수 ANet 생성자에서 가상 메서드를 호출하고 그것을 대체 할 수 있습니다 :

답변

2

C++ 방법은 관리되지 않는 포인터를 받아 그 ANet 별도의 생성자가하는 것

public ref class ANet 
{ 
public: 
    ANet() { un_a = CreateUnmanagedInstance(); } 
... 
protected: 
    virtual A* CreateUnmanagedInstance() { return new A(); } 

public ref class BNet : public ANet 
{ 
... 
protected: 
    virtual A* CreateUnmanagedInstance() override { return new B(); } 
... 

그러나이 방법은 네이티브 C++ 클래스에서 작동하지 않으므로 너무 까다롭고 유해한 것으로 간주 될 수 있습니다.

관련 문제