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
생성자에서 가상 메서드를 호출하고 그것을 대체 할 수 있습니다 :