상속(Inheritance)은 객체 지향 프로그래밍의 주요한 특성 중 하나이며 이를 통해 프로그램의 논리적 구조를 계층적으로 구성할 수 있다. 자식 클래스(Child Class)가 부모 클래스(Parent Class)의 속성을 그대로 물려받아 사용할 수 있다. 따라서 소스 코드의 재사용성을 높인다.
자식 클래스는 파생 클래스(Derived Class)라고도 불리며 부모 클래스의 모든 속성을 물려받는다. 자식 클래스는 콜론(:)을 활용해 부모 클래스와 연결 된다.
#include<iostream>
#include<string>
using namespace std;
class Person{
private:
string name;
public:
Person(string name) : name(name) { }
string getName() {
return name;
}
void showName() {
cout << "이름: " << getName() << '\n';
}
};
class Student: Person{
private:
int studentID;
public:
Student(int studentID, string name) : Person(name) {
this->studentID = studentID;
}
void show() {
cout << "학생번호: " << studentID << '\n';
cout << "학생이름: " << getName() << '\n';
}
};
int main(void) {
Student student(1, "나동빈");
student.show();
system("pause");
}
자식 클래스의 인스턴스를 만들 때 부모 클래스의 생성자가 호출 된 후 자식 클래스의 생성자가 호출 된다. 소멸자의 경우 자식 클래스의 소멸자가 호출되고 부모 클래스의 소멸자가 호출된다.
오버라이딩(Overriding)은 부모 클래스에서 정의된 함수를 자식 클래스에서 재정의하는 문법이다. 오버라이딩을 적용한 함수의 원형은 기존의 함수와 동일한 매개변수를 전달 받는다.
#include<iostream>
#include<string>
using namespace std;
class Person{
private:
string name;
public:
Person(string name) : name(name) { }
string getName() {
return name;
}
void showName() {
cout << "이름: " << getName() << '\n';
}
};
class Student: Person{
private:
int studentID;
public:
Student(int studentID, string name) : Person(name) {
this->studentID = studentID;
}
void show() {
cout << "학생번호: " << studentID << '\n';
cout << "학생이름: " << getName() << '\n';
}
// 오버라이드
void showName() {
cout << "학생 이름 : " << getName() << '\n';
}
};
int main(void) {
Student student(1, "나동빈");
student.showName();
system("pause");
}
다중 상속(Multiple Inheritance)는 여러 개의 클래스로부터 멤버를 상속 받는 것을 말한다.
#include<iostream>
#include<string>
using namespace std;
class Person{
private:
string name;
public:
Person(string name) : name(name) { }
string getName() {
return name;
}
void showName() {
cout << "이름: " << getName() << '\n';
}
};
class Temp {
public:
void showTemp() {
cout << "임시 부모 클래스\n";
}
};
class Student: Person, public Temp{
private:
int studentID;
public:
Student(int studentID, string name) : Person(name) {
this->studentID = studentID;
}
void show() {
cout << "학생번호: " << studentID << '\n';
cout << "학생이름: " << getName() << '\n';
}
// 오버라이드
void showName() {
cout << "학생 이름 : " << getName() << '\n';
}
};
int main(void) {
Student student(1, "나동빈");
student.showName();
student.showTemp();
system("pause");
}
public 키워드는 왜 Temp에만 붙는가?