상속의 장점은 기본 클래스 객체의 포인터나 참조자를 통해 파생 클래스 객체를 조작할 수 있는 점
class BST { ... };
class BalancedBST : public BST { ... };
void printBSTArray(ostream& s, const BST array[], int numElements)
{
for(int index = 0; index < numElements; ++index)
{
s << array[index]; // BST 클래스에서 operator<<이 정의되어 있다고 가정
}
}
BST BSTArray[10];
printBSTArray(cout, BSTArray, 10); // 정상
BalancedBST bBSTArray[10];
printBSTArray(cout, bSTArray, 10); // 미정의 동작
array[index]의 표현식은 *(array + index)이고, array+index가 가리키는 메모리 위치는 array + index * sizeof(BST)
따라서 컴파일러는 배열 내의 요소 위치를 정확히 지정하는 코드를 생성하기 위해 배열의 요소 객체 크기를 결정할 수 있어야 함
하지만 BalancedBST의 배열을 printBSTArray 함수에 전달하면 컴파일러는 배열의 요소 객체 크기를 BST라고 가정하지만 실제로는 BalancedBST의 크기를 갖고 있기 때문에 정확한 메모리 위치를 지정할 수 없어 미정의 동작 발생
결론적으로, 배열은 포인터의 산술 연산을 같이 할 뿐이므로 다형성을 갖고 있다는 생각은 하지 말자
'C++ > More Effective C++' 카테고리의 다른 글
[More Effective C++] 항목 6 증가 및 감소 연산자의 전위/후위 형태를 반드시 구분하자 (0) | 2025.02.15 |
---|---|
[More Effective C++] 항목 5 사용자 정의 타입 변환 함수에 대한 주의를 놓지 말자 (0) | 2025.02.13 |
[More Effective C++] 항목 4 쓸데 없는 기본 생성자는 그냥 두지 말자 (0) | 2025.02.13 |
More Effective C++ 항목 2 가능한 C++ 스타일의 캐스트를 즐겨 쓰자 (0) | 2025.02.07 |
More Effective C++ 항목 1 포인터와 참조자를 구분하자 (0) | 2025.02.06 |