C++에서 클래스 상속(inheritance)이란 기존에 정의되어 있는 클래스의 모든 멤버 변수와 멤버 함수를 물려받아, 새로운 클래스를 작성하는 것을 의미한다.
ㅇ 기존에 정의되어 있던 클래스를 base class 또는 parent class 또는 super class 라고 한다.
ㅇ 이를 상속받아(→모든 특성을 물려받아) 새로 만들어지는 클래스를 파생(derived) 클래스 또는 자식 클래스, 하위(sub) 클래스라고 한다.
ㅇ 기존에 작성된 클래스를 재활용할 수 있다.
ㅇ class 파생클래스명 : public 부모클래스명 {
// 접근 제어 지시자 : public, protected, private
// 상속시 부모 클래스에서 접근 가능한 멤버는 protected와 public 뿐이다.
}
접근제어 지시자
public | 클래스 외부 접근 허용 | 자식 클래스 접근 허용 |
클래스 내부 접근 허용 | proteced 로 상속을 받으면 부모 클래스를 proteced 로 상속함
|
protected |
클래스 외부 접근 불가 |
자식 클래스 접근 허용
|
클래스 내부 접근 허용 | |
private |
클래스 외부 접근 불가
|
자식 클래스 접근 불가
|
클래스 내부 접근 허용 | |
예제는 헤더파일(선언부)와 cpp 파일(정의부)를 분리하는 걸 고려하여 코드를 작성했다.
예제1
#include <iostream> #include <string>
using namespace std;
class Person { private: string name; int age; public: Person(); // 기본 생성자 Person(const string& name, int age); ~Person(); // 소멸자
void setName(string name); void setAge(int age);
string getName(); int getAge(); };
Person::Person() { cout << " Person 기본 생성자 호출- 메모리 주소 : " << this << endl; this->name = ""; this->age = 0; }
Person::Person(const string& name, int age) { cout << " Person 매개변수 2개 생성자 호출- 메모리 주소 : " << this << endl; this->name = name; this->age = age; }
Person::~Person() { cout << " ~Person() 호출- 메모리 주소 : " << this << endl; }
void Person::setName(string name) { this->name = name; }
void Person::setAge(int age) { this->age = age; }
string Person::getName() { return this->name; }
int Person::getAge() { return this->age; }
class UStudent : public Person { // 접근 제어 지시자를 변경해보면서 에러 발생을 확인해 보자 private: string id; // 학번 string major; // 전공과목 public: UStudent(); UStudent(const string& id, const string& major, const string& name, int age); ~UStudent();
void setId(string id); void setMajor(string major);
string getId(); string getMajor();
void Display(); //메시지 출력 };
UStudent::UStudent() { cout << " UStudent 기본 생성자 호출- 메모리 주소 : " << this << endl; }
UStudent::UStudent(const string& id, const string& major, const string& name, int age) : Person(name, age) { cout << " UStudent 매개변수 4개 생성자 호출- 메모리 주소 : " << this << endl; this->id = id; this->major = major; }
UStudent::~UStudent() { cout << " ~UStudent() 호출- 메모리 주소 : " << this << endl; }
void UStudent::setId(string id) { this->id = id; }
void UStudent::setMajor(string major) { this->major = major; }
string UStudent::getId() { return this->id; }
string UStudent::getMajor() { return this->major; }
void UStudent::Display() { cout << " 성명 : " << this->getName() << ", 나이 : " << this->getAge() << ", 학번 : " << this->getId() << ", 전공 : " << this->getMajor() << endl; }
int main() {
UStudent std1; // 파생 클래스의 객체를 생성하면, 제일 먼저 기초 클래스의 생성자를 호출 std1.setName("이순신"); std1.setAge(20); std1.setId("20190001"); std1.setMajor("전기전자공학부"); std1.Display();
cout << endl;
UStudent std2("20160002", "사회복지학부", "홍길동", 23); std2.Display();
cout << endl; // 객체가 소멸되는 순서는 객체가 생성된 순서의 반대다.
}
|
실행결과
참고하면 도움될 게시글
상속과 접근 제어 유투브 강좌 : https://www.youtube.com/watch?v=yWI8GTLsBR8
상속 접근 지정자 : https://thrillfighter.tistory.com/531