본문 바로가기
개발 언어/cpp

CPP 클래스 상속(Inheritance)

by eeeun:) 2021. 12. 22.
반응형

클래스 상속이란?

상속하는 클래스 = 기초 클래스, 부모 클래스

상속받는 클래스 = 파생 클래스, 자식 클래스

 

class Robot1 {
protected:
public:
private:
};

class Robot2:Robot1 {
};

자식 클래스 : 연산자 옆에 어떤 클래스를 상속받을지 작성.

protected = private + 자식 클래스의 접근 허용

 

자식 클래스 특징

  • 반드시 자신만의 생성자를 가져야 됨.
  • 접근할 수 있는 부모 클래스의 모든 멤버 변수, 함수를 가짐.
  • 추가로 멤버 변수, 함수 추가 가능.

 

자식 클래스의 객체 생성, 소멸 순서

[생성] 부모 클래스 생성자 호출 및 멤버 변수 초기화 -> 자식 클래스 생성자 호출

[소멸] 자식 클래스 소멸자 호출 -> 부모 클래스 소멸자 호출

 

다중 상속

cpp은 다중 상속 가능. 하지만 여러 문제점 주의.

[문제점]

  1. 상속받은 여러 부모 클래스에 같은 이름의 멤버가 존재할 가능성.
  2. 하나의 클래스를 간접적으로 두 번 이상 상속받을 가능성.(다이아몬드 상속)

다중 상속 문제점 1) 해결법

class	A{
public:
	std::string name;
};

class	B{
public:
	std::string name;
};

class	C:A, B{
public:
	using A::name;
};

다이아몬드 상속

다이아몬드 상속을 코드로 살펴보자.

class A {
public:
	int a;
};

class B:A {
};

class C:A {
};

class D:B, C {
};

int main() {
	D d;
    	d.a = 4; //error!
}
자식 클래스 부모 클래스
B A
C A
D B(A), C(A)

D는 B와 C를 상속받으면서 A를 두 번 상속받게 된다.

main문 d.a에서 B에서 상속받은 A의 a값인지, C에서 상속받은 A의 a값인지가 모호해 컴파일 에러가 난다.

 

이를 해결해 주기 위해 virtual 키위드를 사용!

class B:virtual A {
};

class C:virtual A {
};
728x90

댓글