reference:
"명품 C++ Programming" / 황기태
"전문가를 위한 C++" / 마크 그레고리
상속은 객체지향언어의 본질적 특성이다. 상속 개념이 없다면 객체지향언어라 할 수 없다. 상속은 소프트웨어 재사용을 가능하게 하며, 동적 바인딩을 통해 객체지향 프로그래밍의 묘미를 그대로 살리는 매우 중요한 기능이다.
동일한 코드가 여러 클래스에 중복되면 클래스의 유지 보수에 번거로운 일이다. 중복되는 코드들을 상위 클래스에 구현하고, 이를 수정하면 서브 클래스들에 대한 수정이 필요없어진다. 결국 중복을 제거하여 클래스를 간결하게 구현하면서 동시에 유지 보수을 쉽게 할 수 있다는 장점이 있다.
진정한 다형성(유연성과 변경 용이성을 제공하는)의 기반은 바로 '상속'이다.
즉, 상속을 통해서 다형성을 이룰 수 있다.
상속을 통해 계층 관계로 표현되면 클래스나 객체의 관리가 용이해진다. (1번 목적, 장점과 유사)
상속의 가장 큰 장점은 소프트웨어 생산성을 향상하는데 있다. 상속은 기존에 작성해 놓은 클래스를 상속다고 기능을 확장하여 새로운 소프트웨어를 빠른 시간 내에 만들어 낼 수 있다. 즉 소프트웨어 생산성이 높아진다.
참고로 기본 클래스에 선언된 private 멤버는 파생 클래스 객체에도 포함되지만, 파생 클래스의 어떤 함수에서도 직접 접근할 수 없다.
class Point {
int x, y;
public:
void set(int x, int y) {
this->x = x;
this->y = y;
}
void showPoint() {
cout << "(" << x << ", " << y << ")" << endl;
}
};
class ColorPoint : public Point {
string color;
public:
void setColor(string color) {
this->color = color;
}
void showColorPoint() {
cout << "color: " << color << endl;
showPoint();
}
};

"파생 클래스 포인터가 기본 클래스 포인터에 치환되는 것"

업 캐스팅이란 파생 클래스의 객체를 기본 클래스의 포인터로 가리키는 것을 말한다.
기본 클래스 타입의 포인터로 파생 클래스 객체를 가리킬 때는 파생 클래스 객체의 기본 클래스 멤버(함수)만 접근할 수 있다.
같은 함수의 이름으로 자식 클래스에서 재정의하더라도 부모 클래스의 멤버 함수가 호출된다(<---> 오버라이딩).
업 캐스팅 시에는 명시적 타입 변환이 필요없다.
=> 업 캐스팅은 오버라이딩과 동적 바인딩의 기초
"기본 클래스의 포인터가 파생 클래스의 포인터에 치환되는 것"

기본 클래스 포인터가 가리키는 객체를 파생 클래스의 포인터로 가리키는 것을 다운 캐스팅이라하고 이는 명시적으로 타입 변한을 지정해야 한다.
파생 클래스의 객체가 생성될 때 파생 클래스의 생성자, 기본 클래스의 생성자 모두 실행된다. 파생 클래스의 생성자는 파생 클래스의 멤버를 초기화하거나, 필요한 초기 작업을 수행하고, 기본 클래스의 생성자는 기본 클래스의 멤버 초기화나 필요한 초기화를 각각 수행한다.
파생 클래스의 생성자가 먼저 호출되지만, 결국 기본 클래스의 생성자가 먼저 실행되고 파생 클래스의 생성자가 나중에 실행된다.
생성자가 호출되는 순서를 이해해야 하는 이유는 파생 클래스의 생성자에서 기본 클래스의 생성자를 호출할 때 필요한 인자 값을 전달하기 때문이다.
파생 클래스의 소멸자 코드를 실행한 후 기본 클래스의 소멸자가 호출하도록 컴파일된다.
public 상속
기본 클래스를 public으로 상속받으면, 기본 클래스의 protected, public 멤버들은 접근 지정 변경 없이 파생 클래스에 그대로 상속 확장된다.
protected 상속
기본 클래스를 protected로 상속받으면, 기본 클래스의 protected, public 멤버들은 모두 protected 접근 지정으로 변경되어 파생 클래스에 상속 확장된다.
private 상속
기본 클래스를 private로 상속받으면, 기본 클래스의 protected, public 멤버들은 모두 private 접근 지정으로 변경되어 파생 클래스에 상속 확장된다.
