상속(Inheritance)이란 자식 클래스가 부모 클래스의 속성을 그대로 물려 받을 수 있는 기능을 말한다. 객체 지향 프로그래밍의 주요한 기능중에 하나이고 이를 잘 활용하면 소스코드의 재사용성을 높여준다.
부모 클래스의 특성을 내려받는 것은 부모 클래스가 가지고 있는 멤버 변수, 멤버 메서드, 생성자와 소멸자 등이 있다.
Animal 클래스
// Animal.h
class Animal
{
public:
Animal(int age);
private:
int mAge;
};
// Animal.cpp
#include "Animal.h"
Animal::Animal(int age)
:mAge(age)
{
}
Cat 클래스
// Cat.h
class Cat : public Animal
{
public:
cat(int age, const char* name);
private:
char* mName;
};
// Cat.cpp
#include "Cat.h"
Cat::Cat(int age, const char* name)
: Animal(age)
{
size_t size = strlen(name) + 1;
mName = new char[size];
strcpy(mName, name);
}
Animal 클래스는 동물을 표현하기 위한 클래스이고 동물의 나이만 private 변수로 가지고 있다. Cat 클래스는 Animal 클래스를 상속받아서 만든 클래스이다. 상속을 표현하기 위해서 아래와 같이 선언한다.
class Cat : public Animal
이때 public은 상속받을 클래스의 접근제어를 나타내고 아래와 같이 제어를 한다.
부모 클래스 멤버 | ||||
public | protected | private | ||
상속 접근 제어 | public | public | protected | private |
protected | protected | protected | private | |
private | private | private | private |
즉, 상속받을 때 접근제어를 public으로 하면 부모 클래스에서 선언된 멤버들의 접근 제어가 동일하게 적용되지만 만약 protected로 상속받게 되면 부모 클래스에서 public으로 선언된 멤버라 할지라도 자식 클래스에서는 protected로 선언된다.
그리고 자식클래스를 초기화 할때는 아래와 같이 부모클래스를 초기화 리스트로 호출한다.
Cat::Cat(int age, const char* name)
: Animal(age)
상속할때 메모리 사용에 대해서 알아보자.
위 코드와 같이 main에서 cat 클래스를 포인터로 선언할 때 포인터 주소가 stack에 올라가게 되고 new를 통해서 heap에 메모리가 할당되고 cat의 생성자가 실행되게 된다. 이때 앞서 설명한 것과 같이 부모클래스를 초기화 리스트로 호출하기 때문에 heap 메모리에는 부모클래스의 age가 메모리를 먼저 선점하게 된다. 그 이후에 cat의 생성자가 실행되면서 mName의 포인터가 할당되고 그 데이터가 메모리에 저장되게 된다.
'Programming > C++ 스터디' 카테고리의 다른 글
포인터 (0) | 2022.06.16 |
---|---|
객체지향 프로그래밍 : 생성자 (0) | 2021.09.01 |
객체지향 프로그래밍 : 클래스와 객체 (0) | 2021.08.30 |