객체지향 프로그래밍에서 가장 중요한 목적 중 하나는 재사용할 수 있는 코드를 제공하는 것이다
C++와 클래스는 더 높은 수준의 재활용성을 제공한다
그것이 바로 상속 기능이다
어떤 클래스를 다른 클래스로부터 상속할 때, 기존 클래스
어떤 클래스를 다른 클래스로부터 상속할 때, 상속받는 클래스
class 파생클래스이름 : public 기초클래스이름 {
// code
}
파생 클래스는 기초 클래스의 public 멤버 함수들에게 접근할 수 있으나, private 멤버 변수들에게는 접근할 수 없다
더 근본적으로 들어가면,
프로그램은 먼저 기초 클래스의 객체를 생성하고 기초 클래스의 객체에 덧붙이는 방법으로 파생 클래스의 객체를 생성한다
즉, 프로그램이 파생 클래스의 생성자 안으로 들어가기 이전에 기초 클래스의 객체가 먼저 생성된다는 것이다
C++은 이를 실행하기 위해 멤버 초기자 리스트 문법을 사용한다
파생클래스 :: 힘수() : 기초클래스(){
}
파생클래스 :: 함수(int h, int m, int d) : 기초클래스(h, m) {
}
": 기초클래스(~)" 부분이 멤버 초기자 리스트이다
함수가 처해지는 상황에 따라서 동작을 달리하는 것
메서드에 virtual 이라는 키워드가 붙으면 가상 메서드가 된다
가상 메서드는 프로그램에게 서로 독립된 두 개의 메서드 정의가 있다는 것을 알려주게 되고, 프로그램은 함수가 호출되었을 때 이를 호출한 클래스의 객체를 따져서 그에 대응되는 함수를 선택한다
상속을 위해 기초 클래스로 사용할 클래스를 정의할 때,
파생 클래스에서 다시 정의해야 하는 클래스 함수는 가상 함수로 선언해야 한다
아래와 같이 기초 클래스에서 virtual 키워드를 붙여주면 된다
class 기초클래스
{
private:
// ~~~
public:
// ~~~
virtual void 함수();
};
기초 클래스에서 가상 메서드를 선언하게 된다면,
그 함수는 기초 클래스 및 파생 클래스까지 계속해서 가상 함수로 정의된다
객체에 대한 참조 혹은 객체를 지시하는 포인터를 사용하여서 가상 메서드가 호출된다면, 참조나 포인터를 위해 함수가 사용되는 것이 아니라 그 객체를 위해 정의된 메서드를 사용한다