Cpp - 상속, 다중 상속

eelijus·2022년 5월 4일
0

Cpp/C++

목록 보기
2/10
post-thumbnail

💡 상속, 다중 상속

상속 (inheritance)

: 기존에 존재하는 클래스의 속성이나 기능, 즉 멤버 변수와 함수를 물려받아 그대로 사용 혹은 개선 또는 확장해 사용하는 것


Person이라는 부모 클래스를 상속받는 자식 클래스 Sujilee를 생성해보자

/*
class 자식클래스명: 접근제어자 부모클래스명 {
		자식클래스 멤버			
};
*/


class Sujilee(): Public Person() {
   //code
};

접근제어자에 따라 자식클래스에서의 부모클래스 멤버에 대한 접근 여부가 결정

  1. public : 부모클래스에서 지정한 권한을 자식 클래스의 멤버들에게도 똑같이 지정됨
  2. protected : 부모클래스에서 public으로 지정된 멤버는 자식클래스에서 protected로 지정되며 나머지는 부모클래스와 동일하게 지정됨
  3. private : 부모클래스의 모든 멤버는 자식 클래스에서 private로 지정됨
상속부모클래스자식클래스
publicpublicpublic, 접근 가능
protectedprotected, 접근 가능
privateprivate, 접근 불가
protectedpublicprotected, 접근 가능
protectedprotected, 접근 가능
privateprivate, 접근 불가
privatepublicprivate, 접근 불가
protectedprivate, 접근 불가
privateprivate, 접근 불가

  • Person 클래스를 상속받는 Sujilee 클래스를 간단히 구현해보자
#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

우선 부모 클래스로부터 물려받은 멤버 변수의 초기화를 위해 부모 클래스의 생성자가 먼저 호출되는 것을 확인할 수 있다.


다중 상속(multiple inheritance

: 두 개 이상의 여러 클래스를 하나의 자식 클래스가 상속받는 것


선언 예시

class Sujilee :public Person, private ToughGuy {
  //code
};
profile
sujileelea

0개의 댓글