[C++] 가상 함수 테이블, 접근 제어(protected,private), 추상화 기초 클래스, 순수 가상 함수, 디폴트 생성자, 객체리턴/참조리턴, 기초클래스 파괴자, 프렌드 상속
가상 함수 테이블 (Virtual Function Table, VTBL)
- 컴파일러가 가상 함수를 다룰 때 각각의 객체에 숨겨진 멤버를 하나씩 추가하고, 숨겨진 멤버를 함수의 주소들로 이루어진 배열을 지시하는 포인터로 저장하는 것이다.
- 즉, 가상 함수 테이블에는 클래스의 객체들을 위해 선언된 가상 함수들의 주소가 저장됭 있다.
접근 제어 : protected, private
- 파생클래스의 멤버들은 기초클래스의 protected 멤버에 직접 접근할 수 있지만, private 멤버에는 직접 접근할 수 없다.
- protected 멤버들은 바깥 세계에서 보면 private 멤버처럼 행동하지만, 파생 클래스의 입장에서 바라보면 public 멤버와 같이 행동한다.
- 가능하다면 protected 접근 제어보다 private 접근 제어를 사용하여 클래스 데이터 멤버들에 접급해야 하고, 파생 클래스가 기초 클래스 데이터에 접근하게 하려면 기초 클래스의 메서드를 사용해야 한다.
추상화 기초 클래스 (Abstract Base Class, ABC)
- 다형적인 접근을 사용할 수 있게하며, 구현되지 않는 함수를 위해 순수 가상 함수를 사용할 수 있다.
- 추상화 기초 클래스란 구현 문제를 배제시킨 채 인터페이스를 정의하는 클래스이다.
- 예를 들어 Circle이나 Square의 도형 클래스를 파생할 수 있는 Shape 추상화 기초 클래스를 정의할 수 있다.
- 추상화 기초 클래스는 적어도 하나의 순수 가상 메서드를 가져야 한다.
순수 가상 함수 (Pure Virtual Function)
- 순수 가상 함수는 선언 뒤에 = 0 을 가진다.
- 클래스 선언에 순수 가상 함수가 들어 있으면, 그 클래스는 기초 클래스의 역할을 위해서만 존재하게 되므로 객체를 생성할 수 없다.
- 또한 순수 가상 함수에서는 함수를 반드시 정의할 필요가 없다.
- 어떤 클래스가 진짜 추상화 기초 클래스가 되려면, 적어도 하나의 순수 가상 함수를 가져야 한다.
디폴트 생성자
- 디폴트 생성자는 매개변수를 전혀 사용하지 않거나, 모든 매개변수가 디폴트 매개변수를 사용하는 생성자이다.
- 사용자가 생성자를 하나도 정의하지 않으면, 사용자를 대신하여 컴파일러가 디폴트 생성자를 정의한다.
객체 리턴 / 참조 리턴
- 객체를 리턴하면 리턴된 객체의 임시 복사본을 생성하기 때문에, 복사 생성하를 호출하고 이는 복사본을 생성하는 시간 부담과, 나중에 파괴자를 호출하여 복사본을 없애야 하는 시간 부담이 따른다.
- 참조를 리턴하면 객체에 대한 참조값을 리턴하기 때문에, 복사본을 만들어서 파괴해야 하는 시간부담을 줄일 수 있어 참조를 리턴하는 것이 시간과 메모리를 절약할 수 있어 더 좋다.
- 그러나 함수 안에서 생성된 임시 객체에 대한 참조를 리턴하는 것은 함수가 종료되어 객체가 파괴되면, 더 이상 참조가 유효하지 않기 때문에 불가능하다.
기초클래스 파괴자
- 기초클래스의 파괴자는 가상이어야 한다.
- 객체에 대한 기초 클래스 포인터나 참조를 통해 파생 클래스 객체를 파괴할 때, 프로그램은 기초 클래스 파괴자만 사용하는 것이 아니라, 파생 클래스 파괴자를 먼저 사용하고, 뒤이어 기초 클래스 파괴자를 사용한다.
프렌드 상속
- 프렌드 함수는 클래스 멤버가 아니기 때문에 상속되지 않는다.
- 그러나 파생 클래스의 프렌드를 기초 클래스의 프렌드로 사용하려면 기초 클래스에서 프렌드 함수에 대응하는 것으로 데이터형 캐스트를 실시하고, 캐스트의 참조나 포인터를 사용하여 기초 클래스 프렌드를 호출하면 된다.