문제

이 질문은 이미 여기에 답이 있습니다.

클래스 A가 있습니다.

class A
{
    public:
        virtual double getValue() = 0;
}

그리고 클래스 B :

class B : public A
{
    public:
        virtual double getValue() { return 0.0; }
}

그리고 main ()에서 나는한다 :

A * var;
var = new B[100];
std::cout << var[0].getValue(); //This works fine
std::cout << var[1].getValue(); //This, or any other index besides 0, causes the program to quit

대신 내가하는 경우 :

B * var;
var = new B[100];
std::cout << var[0].getValue(); //This works fine
std::cout << var[1].getValue(); //Everything else works fine too

모든 것이 잘 컴파일되지만 다형성에 문제가있는 것처럼 보입니다. 나는 당황했다.

도움이 되었습니까?

해결책

배열을 다형적으로 처리 할 수는 없습니다 new B[100] 배열을 만듭니다 B 객체 및 배열에 대한 포인터를 반환합니다. 또는 배열의 첫 번째 요소와 동등 하게이 포인터를 기본 클래스에 포인터에 할당하는 것이 유효하지만, 이것을 포인터로 취급하는 것은 유효하지 않습니다. A 사물.

당신이 할 수없는 주된 이유는 (일반적으로) 파생 된 객체가 기본 클래스와 다른 크기이므로, 기본 클래스 객체 배열로 배열에 액세스하려고 시도하면 올바른 오프셋을 사용하여 다음을 포인터로 가져 오지 않습니다. 파생 클래스 배열의 다음 멤버의 기본 클래스 하위 객체.

다른 팁

다형성에는 문제가 없지만 기억을 다루는 방식에는 문제가 없습니다. [] 연산자는 첫 번째 경우 (a) 바이트의 크기와 두 번째 케이스의 크기 (b) 바이트에 의해 배열을 통해 당신을 진전시킵니다. 객체는 B 형이기 때문에 A*는 메모리의 올바른 위치를 가리키지 않습니다.

다음은 그것을 보는 또 다른 방법이 있습니다

char * var;
var = (char*) new B[100];
std::cout << ((A*)var[0]).getValue(); //This works fine
std::cout << ((A*)var[1]).getValue(); //This will fail
std::cout << ((A*)var[sizeof(B)]).getValue(); // should work

배열에서 객체를 할당하지 않았습니다.

for (int i=0;i<100;i++)
  var[i] = new B;

(C ++ 및 C#을 혼합하고있을 수도 있지만)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top