💡 상속, 다중 상속
: 기존에 존재하는 클래스의 속성이나 기능, 즉 멤버 변수와 함수를 물려받아 그대로 사용 혹은 개선 또는 확장해 사용하는 것
Person이라는 부모 클래스를 상속받는 자식 클래스 Sujilee를 생성해보자
/*
class 자식클래스명: 접근제어자 부모클래스명 {
자식클래스 멤버
};
*/
class Sujilee(): Public Person() {
//code
};
접근제어자에 따라 자식클래스에서의 부모클래스 멤버에 대한 접근 여부가 결정
상속 | 부모클래스 | 자식클래스 |
---|---|---|
public | public | public, 접근 가능 |
protected | protected, 접근 가능 | |
private | private, 접근 불가 | |
protected | public | protected, 접근 가능 |
protected | protected, 접근 가능 | |
private | private, 접근 불가 | |
private | public | private, 접근 불가 |
protected | private, 접근 불가 | |
private | private, 접근 불가 |
#include <iostream>
class Person {
private:
bool breath;
bool leg;
public:
Person() :breath(true), leg(true) {};
void printInfo() {
if (breath && leg) {
std::cout << "person" << std::endl;
}
}
void ability() {
std::cout << "average" << std::endl;
}
};
class Sujilee :public Person {
public :
Sujilee() :Person() {};
//함수 오버라이딩
void ability() {
std::cout << "outstanding" << std::endl;
}
};
int main() {
Sujilee suji;
//Sujilee 클래스에서 정의하지 않은 함수를 부모로부터 상속받아 사용할 수 있다.
suji.printInfo(); //OUTPUT : person
suji.ability(); //OUTPUT : outstanding
}
public
접근 제어자를 통해 상속받음
-> 자식클래스에서 새로운 멤버 변수를 생성하지 않았으므로 부모클래스에서 물려받은 멤버 변수만 가지고 있음
->private
으로 물려받았기 때문에 부모 멤버 변수에 직접 접근이 불가능
->public
으로 물려받은 부모클래스의 생성자를 그대로 이용
만약 자식클래스가 멤버 변수를 갖는다면 생성자의 Person()뒤에 멤버 변수의 이니셜라이저를 추가해주면 됨.
#include <iostream>
class Person {
private:
bool breath;
bool leg;
public:
Person() :breath(true), leg(true) {
std::cout << "Parent constructor" << std::endl;
}
~Person() {
std::cout << "Parent destructor" << std::endl;
}
void printInfo() {
if (breath && leg) {
std::cout << "person" << std::endl;
}
}
void ability() {
std::cout << "average" << std::endl;
}
};
class Sujilee :public Person {
private:
std::string mbti;
public :
Sujilee(std::string m) :Person(), mbti(m) {
std::cout << "child construcdtor" << std::endl;
};
~Sujilee() {
std::cout << "child destructor" << std::endl;
}
void ability() {
std::cout << "outstanding" << std::endl;
}
void printMbti() {
std::cout << mbti << std::endl;
}
};
int main() {
//이니셜라이저에서 부모클래스의 생성자 호출 및 자신의 멤버 변수 초기화
Sujilee suji("ENTJ");
suji.printInfo();
suji.ability();
suji.printMbti();
}
컴파일 결과는 아래와 같다.
Parent constructor
child construcdtor
person
outstanding
ENTJ
child destructor
Parent destructor
우선 부모 클래스로부터 물려받은 멤버 변수의 초기화를 위해 부모 클래스의 생성자가 먼저 호출되는 것을 확인할 수 있다.
: 두 개 이상의 여러 클래스를 하나의 자식 클래스가 상속받는 것
선언 예시
class Sujilee :public Person, private ToughGuy {
//code
};