프로그래밍 언어/C & C++ 정리

OOP - 상속

뽀또치즈맛 2024. 11. 11. 21:33

상속의 특징

다른 클래스의 특성들을 내려 받는다.

  • Base Class
    • 부모 클래스
  •  Derived Class
    • 자식 클래스

파생 클래스의 개체는 다음의 것들을 가진다.

  • 베이스 클래스의 멤버 변수
  • 베이스 클래스이 멤버 메서드
  • 자신의 생성자와 소멸자

 
파생 클래스는 멤버 변수 및 메서드 추가가 가능하다.
 
상속은 is a관계를 가진다.
 

상속의 이점

상속을 쓰는 가장 간편한 이유는
부모 클래스가 올바르게 제대로 작동하고 있다는 가정 하에,
자식 클래스가 부모 객체가 가진 변수들은 다 부모에게 넘긴다.
그렇게 되면 자식 클래스는 자신의 변수들만 제대로 관리하면 된다.
 
예시 코드)

Cat::Cat(int age, const char* name)
	: Animal(age)
{
	size_t size = strlen(name)+1;
    mName = new char[size];
    strcpy(mName, name);
}

 

파생 클래스 정의하는 법

class <derived class name> : <access - modifier> <base class name> {};

 
 

파생 클래스의 멤버 접근 수준
 

C++는 JAVA와 달리 상속 시에 베이스 클래스 멤버의 접근 수준을 결정할 수 있다.

  • public 상속
  • private 상속
  • protected 상속

protected 상속은 부모 클래스의
public인 멤버가 protected로 보안성이 높아진다.
 
private 상속은 부모 클래스의
public과 protected인 멤버가 private로 보안성이 높아진다.
 

메모리 할당 측면

부모 메모리와 자식 메모리는 메모리 측면에서는 나란히 있다.
그럼 자식 메모리를 찾기 위해서는
부모 메모리인 Animal 뒤에 있는 것이 Cat의 메모리임을 알 수 있다.
 

생성자 호출

부모 생성자 먼저 호출하고 자식 생성자를 호출한다.
잊지 말자.

메모리 레이아웃을 만들 때
부모 메모리 먼저 생성된 후
자식 메모리가 생성된다.
 
따라서,
부모 생성자를 호출해주지 않았다면,
부모 클래스가 매개 변수가 없는 기본 생성자라는 가정 하에,
암시적으로 컴파일러가 부모 클래스의 생성자 호출한다.
 
만약 부모 생성자에 매기 변수가 들어있다면,
무조건적으로 호출해줘야한다.
그렇지 않으면 컴파일 오류가 뜬다.
 

소멸자 호출

자식 소멸자부터 호출되고 자동으로 부모 소멸자가 호출된다.
 
왜 그럴까?
생각을 해보면
 
소멸자는 딱 하나 밖에 없다.
자식 지워지면
부모 메모리를 지워주는 것이 맞다.

메모리 레이아웃을 잡을 때 먼저 생긴 메모리가
마지막으로 지워지는 것이 안정적이기 때문이다.
 
소멸자 호출은 자동적으로 호출된다.
 
생성자와 소멸자 호출순서는 정반대이다.