반응형
클래스 상속이란?
상속하는 클래스 = 기초 클래스, 부모 클래스
상속받는 클래스 = 파생 클래스, 자식 클래스
class Robot1 {
protected:
public:
private:
};
class Robot2:Robot1 {
};
자식 클래스 : 연산자 옆에 어떤 클래스를 상속받을지 작성.
protected = private + 자식 클래스의 접근 허용
자식 클래스 특징
- 반드시 자신만의 생성자를 가져야 됨.
- 접근할 수 있는 부모 클래스의 모든 멤버 변수, 함수를 가짐.
- 추가로 멤버 변수, 함수 추가 가능.
자식 클래스의 객체 생성, 소멸 순서
[생성] 부모 클래스 생성자 호출 및 멤버 변수 초기화 -> 자식 클래스 생성자 호출
[소멸] 자식 클래스 소멸자 호출 -> 부모 클래스 소멸자 호출
다중 상속
cpp은 다중 상속 가능. 하지만 여러 문제점 주의.
[문제점]
- 상속받은 여러 부모 클래스에 같은 이름의 멤버가 존재할 가능성.
- 하나의 클래스를 간접적으로 두 번 이상 상속받을 가능성.(다이아몬드 상속)
다중 상속 문제점 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
'개발 언어 > cpp' 카테고리의 다른 글
cpp 멤버 함수 안에서 자신과 동일한 클래스 객체 private 멤버 접근 (0) | 2021.12.30 |
---|---|
cpp 증감 연산자 오버로딩 (전위 연산자, 후위 연산자) (0) | 2021.12.30 |
cpp 연산자 오버로딩(Operator Overloading) (0) | 2021.12.21 |
cpp 오버로딩(Overloading) (0) | 2021.12.21 |
cpp 복사생성자 (copy constructor) (0) | 2021.12.21 |
댓글