기본 문법
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;
}
정상적으로 출력된다.
부모 생성자
자식 생성자
자식 소멸자
부모 소멸자
'기타 > C++' 카테고리의 다른 글
[C++] 클래스 간의 조립 (상속, 포함) (0) | 2020.12.29 |
---|---|
[C++] 복사 생성자에 대해서 (2) | 2020.12.24 |
[C++] 메모리 관리, 누수잡기 (0) | 2020.12.23 |
[C++] 참조자 (reference), 포인터와의 차이 (0) | 2020.12.23 |
[C++] 동적 할당과 메모리 해제 (0) | 2020.12.17 |