기타/C++

[C++] 상속에 대해서

푸쿠이 2021. 1. 17. 23:03
기본 문법
class PARENT
{

};
class CHILD : public PARENT
{

};

기본적으로 private로 상속받기 때문에, public을 써주어야 한다.

public 키워드를 쓰면, 부모 클래스의 public 멤버 변수를 public 권한으로 사용할 수 있다.

 

임의적으로 묶을 때 사용한다고 하는데, 거의 안써서 자세히 알고 있을 필요는 없다.

 

상속 클래스의 메모리

parent 클래스를 상속한 child 클래스를 만들게 되면
parent 클래스부터 메모리를 잡고, 그 후에 child 클래스 메모리를 잡는다.

 

그래서 parent 포인터에 child 주소값을 넣을 수 있다.

Parent 포인터이기 때문에, Child 객체의 주소값을 받았더라도 Parent 부분만 사용 가능하다.

#include <iostream>

class PARENT
{
};

class CHILD : public PARENT
{
};

int main()
{
	PARENT* parent = new CHILD(); // 가능하지만, Parent 부분만 접근 가능.
}

 

상속된 클래스의 가상 소멸자

아래 코드의 출력 결과가 어떻게 될까?

#include <iostream>

class PARENT
{
public:
	PARENT() { std::cout << "부모 생성자\n"; }
	~PARENT() { std::cout << "부모 소멸자\n"; }
};

class CHILD : public C_PARENT
{
public:
	CHILD() { std::cout << "자식 생성자\n"; }
	~CHILD() { std::cout << "자식 소멸자\n"; }
};

int main()
{
	C_PARENT* parent = new CHILD();
	delete parent;
}

이렇게 불릴 것 같지만,

부모 생성자
자식 생성자
자식 소멸자
부모 소멸자

실제로는 이렇게 불린다.

child 객체의 소멸자가 불리지 않았다. 동적 할당을 했다면, 메모리 누수가 일어날 수 있는 상황이다.

부모 생성자
자식 생성자
부모 소멸자

parent 포인터는 parent 부분만 사용하므로, 삭제할 때도 parent 소멸자만 불러주는 것이다.

정상적으로 동작하게 만드려면, 아래와 같이 virtual 키워드를 이용해 가상 소멸자를 선언해주어야 한다.

#include <iostream>

class PARENT
{
public:
	PARENT() { std::cout << "부모 생성자\n"; }
	virtual ~PARENT() { std::cout << "부모 소멸자\n"; }
};

class CHILD : public PARENT
{
public:
	CHILD() { std::cout << "자식 생성자\n"; }
	~CHILD() { std::cout << "자식 소멸자\n"; }
};

int main()
{
	PARENT* parent = new CHILD();
	delete parent;
}

정상적으로 출력된다.

부모 생성자
자식 생성자
자식 소멸자
부모 소멸자