▶상속에서의 객체 크기
상속을 하면 객체들의 크기는 어떻게 될까요?
모든 자식 클래스의 객체에는 상속받은 부모의 영역이 있습니다.
따라서 자식 클래스의 크기는 부모의 크기에 자신이 추가한 데이터 멤버의 크기가 더해질 것입니다.
자식 클래스의 크기 = 부모 클래스의 크기 + 자신이 추가한 데이터의 크기
여기서 클래스의 멤버 함수들이나 정적 멤버 변수, 함수들은 당연히 다른 공간에 저장되는 건 알 겁니다.
▶가상 함수와 객체의 크기
가상 함수를 사용하기 위해 컴파일러가 정확히 어떻게 동작하는지 우리가 정확히 알 필요는 없습니다.
이것도 정보 은닉의 장접입니다. 가상 함수를 처리하는 방법만 간단히 알아봅시다.
가상 함수(virtual)가 클래스에 하나라도 있으면 컴파일러는 그 클래스에 대해 가상 함수 테이블(virtual function table)을
만들고 각 가상 함수에 대한 포인터를 저장합니다.
그리고 가상 함수들이 호출되면 실행시간에 이 테이블을 참조하여 실제로 처리해야 함 함수를 찾습니다.
다음은 클래스에 가상 함수를 사용해 가상 함수 테이블이 있는 그림입니다.
이러면 클래스의 크기는 포인터 크기만큼 늘어납니다.
32비트 컴퓨터면 4바이트, 64비트 컴퓨터이면 8바이트만큼 클래스의 크기는 커집니다.
물론 자식 클래스에도 동일한 방법으로 적용됩니다.
자식 클래스의 크기 = 가상 함수에 대한 포인터 크기 + 부모 클래스의 크기 + 자신이 추가한 데이터의 크기
▶참조자와 다형성
보통 동적 바인딩은 포이너를 사용해서 구현하지만 참조자를 사용할 수도 있습니다.
이 경우도 포인터를 사용하는 것과 정확히 동일하게 동작합니다.
아래는 그 예입니다.
for (int i = 0; i < nShape; i++)
list[i]->draw();
이 문장은 다음과 같이 참조자를 이용해 구현할 수 있습니다.
for (int i = 0; i < nShape; i++) {
Shape& s = *list[i];
s.draw();
}
참조자가 객체를 참조하기 때문에 포인터가 아니라 포인터가 가리키는 곳의 내용, 즉 객체 (*list[i])를 참조해야 함에 유의해야 합니다.
또한, 포인터가 아니라 객체의 참조자를 통해 객체의 멤버를 접근하기 위해서는 "->"가 아니라 "." 연산자가 사용되어야 합니다.
'C++ 프로그래밍 > 클래스' 카테고리의 다른 글
프랜드 선언 (1) | 2022.08.22 |
---|---|
다형성-순수 가상 함수와 추상 클래스 (0) | 2022.08.22 |
다형성-가상 함수와 동적 바인딩의 의미 (0) | 2022.08.12 |
다형성-다형성이란? (0) | 2022.08.12 |
다형성-상속에서의 형 변환 (0) | 2022.08.12 |