동일한 코드가 여러 클래스에 중복이 된다면 클래스의 유지 보수에 번거로운 일이 발생하므로 상속을 통해 하나의 클래스만 수정하면 동일한 코드를 사용하는 클래스들 역시 수정이 가능하다.
상속은 서로 관련된 클래스를 계층관계로 표현하여 존재하는 클래스들의 구조적인 관계파악을 쉽게 해준다.
class 파생클래스 : 접근지정자 기본클래스명 {
상속받는 내용
};
ex) Animal을 상속받는 Dog 클래스
class Dog : public Animal {
}
- 이때 사용하는 접근 지정자는 기본 클래스의 범위를 정한다. private 로 선언을 한다면 protected, public 멤버들이 모두 범위가 private로 제한되어 상속되고 protected 로 선언을 한다면 public 멤버들이 protected 멤버로 바뀌어 상속된다.
- 기본클래스의 private 멤버들은 상속이 되지만 기본클래스에서의 접근만 가능하다.
- 상속시 접근 지정자를 생략한다면 자동으로 private 상속이 된다.
#include <iostream>
#include <string>
using namespace std;
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();
};
void ColorPoint::showColorPoint() {
cout << color << " : ";
showPoint();
}
int main() {
Point p;
ColorPoint cp;
cp.set(3, 4);
cp.setColor("GREEN");
cp.showColorPoint();
}
GREEN : (3, 4)
ColorPoint는 상속을 통해 Point의 멤버를 자신의 멤버로 확장한다. ColorPoint의 멤버들은 Point의 private 멤버 외에 모든 멤버를 접근할 수 있다.
#include <iostream>
using namespace std;
class A {
public:
A() {
cout << "A기본생성자 실행" << endl;
}
A(int x) {
cout << "A매개변수 생성자 실행 : " << x << endl;
}
};
class B : public A {
public:
B() {
cout << "B기본생성자 실행" << endl;
}
B(int x) : A(x) {
cout << "B매개변수 생성자 실행 : " << x << endl;
}
};
int main() {
B b(5);
}
A매개변수 생성자 실행 : 5
B매개변수 생성자 실행 : 5
파생클래스에서 기본클래스의 생성자를 선택하려면 파생클래스의 생성자 뒤에 기본클래스의 생성자를 입력해준다.
,
로 나열한다virtual
키워드를 사용하여 가상상속을 선언한다.virtual
키워드는 컴파일러에서 파생클래스의 객체가 생성될 때 기본클래스의 멤버 공간을 오직 한번만 할당하고, 이미 할당되어 있다면 공유하도록 지시한다. 따라서 멤버가 중복되어 상속되는 경우를 피할 수 있다.