다형성 및 배열에 대한 포인터 [중복
-
05-07-2019 - |
문제
이 질문은 이미 여기에 답이 있습니다.
클래스 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#을 혼합하고있을 수도 있지만)
제휴하지 않습니다 StackOverflow