C++ 상속
#include <iostream>
using std::cout;
class P // 기본 클래스, 부모 클래스
{
private:
void a() { cout << "a\n"; }
void b() { cout << "b\n"; }
protected:
void c() { cout << "c\n"; }
void d() { cout << "d\n"; }
public:
void e() { cout << "e\n"; }
void f() { cout << "f\n"; }
};
class C : public P{
};
int main() {
P parent;
C child;
child.X
}
상속
객체 지향 프로그래밍에서 상속은 클래스를 다른 클래스(클래스 기반 상속)를 기반으로 하여 유사한 구현을 유지하는 메커니즘이다. 주로 상속을 받는 클래스는 서브, 파생, 자식클래스로 불리우고 상속을 주는 클래스는 수퍼, 기본, 부모클래스라고 한다.
사용 이유
- 중복 감소
- 개발시간 단축
- 기존 코드 재사용
- 경비절감 등등
사용법
"자식 클래스" : "상속 접근제어" "기본 클래스" {};
아레 표는 상속 접근제어에 따른 자식클래스 멤버의 변화다.
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>
using std::cout;
using std::endl;
class A
{
int x;
public:
void setX(int i){x=i;}
void showX(){cout<<x<<endl;}
};
class B:public A
{
int y;
public:
void setY(int i){y=i;}
void showXY(){showX(); cout<<y<<endl;}
};
int main()
{
B bb;
bb.setX(1); //기본클래스의 멤버접근
bb.setY(2); //파생클래스의 멤버접근
bb.showX(); //기본클래스의 멤버접근
bb.showXY(); //파생클래스의 멤버접근
return 0;
}
생성자와 소멸자
기본클래스와 자식클래스 모두 생성자와 소멸자를 가질 수 있으며, 호출 순서는 상속된 순서에 따른다.
- 생성자는 부모부터 호출
- 소멸자는 자식부터 호출
매개변수가 있는 생성자
기본 클래스의 생성자는 매개변수 없이는 실행되지 않으므로 자식 클래스가 객체를 만들때 기본 클래스의 매개변수를 전달해야한다
방법
"자식클래스의 생성자"("자식클래스의 매개변수"):"기본클래스의 생성자"("매개변수"){}
#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;
}