C++ 상속
상속
객체 지향 프로그래밍에서 상속은 클래스를 다른 클래스(클래스 기반 상속)를 기반으로 하여 유사한 구현을 유지하는 메커니즘이다. 주로 상속을 받는 클래스는 서브, 파생, 자식클래스로 불리우고 상속을 주는 클래스는 수퍼, 기본, 부모클래스라고 한다.
사용 이유
- 중복 감소
- 개발시간 단축
- 기존 코드 재사용
- 경비절감 등등
사용법
"자식 클래스" : "상속 접근제어" "기본 클래스" {};
아레 표는 상속 접근제어에 따른 자식클래스 멤버의 변화다.
private | protected | public | |
---|---|---|---|
private | 상속 불가 | 상속 불가 | 상속 불가 |
protected | private | protected | protected |
public | private | protected | public |
- 주로 public을 많이 사용한다.
- private로 상속을 받으면 기본클래스 모든 멤버가 private가 된다.
- protected는 상속 가능한 private다.
- 이러한 이유로 보통 protected멤버와 public상속제어 조합을 주로 사용한다.
주의사항
- 위 표에서 보이듯이 public을 사용해도 기본클래스의 private속성 멤버들은 상속되지 않는다.
- private로 상속을 받을때 모든 멤버가 private가 된다는건, 자식클래스의 멤버들만 접근이 가능하다.
생성자와 소멸자
기본클래스와 자식클래스 모두 생성자와 소멸자를 가질 수 있으며, 호출 순서는 상속된 순서에 따른다.
- 생성자는 부모부터 호출
- 소멸자는 자식부터 호출
매개변수가 있는 생성자
기본 클래스의 생성자는 매개변수 없이는 실행되지 않으므로 자식 클래스가 객체를 만들때 기본 클래스의 매개변수를 전달해야한다
방법
"자식클래스의 생성자"("자식클래스의 매개변수"):"기본클래스의 생성자"("매개변수"){}
#include <iostream>
class Man {
protected:
std::string name;
int age;
public:
Man(std::string name, int age){
this->name = name;
this->age = age;
}
void m_show() {
std::cout << "이름:" << name << std::endl;
std::cout << "나이:" << age << std::endl;
}
};
class Student : public Man{
std::string ban;
std::string hak;
public:
Student(std::string name, int age, std::string ban, std::string hak) : Man(name, age){
this->ban = ban;
this->hak = hak;
}
void s_show() {
m_show();
std::cout << "반:" << ban << std::endl;
std::cout << "학번:" << hak << std::endl;
}
};
class Teacher : public Man{
std::string major;
std::string subject;
public:
Teacher(std::string name, int age, std::string major, std::string subject) : Man(name, age){
this->major = major;
this->subject = subject;
}
void t_show() {
m_show();
std::cout << "전공:" << major << std::endl;
std::cout << "담당과목:" << subject << std::endl;
}
};
int main()
{
Student kks("김컴소", 20, "C반", "202012000");
Teacher hsh("한미소", 40, "전산", "C++프로그래밍");
kks.s_show();
hsh.t_show();
return 0;
}