오늘 학습한 내용
순수 가상 함수
class Test
{
virtual void YouMustOverrideThis() = 0;
}
위와 같이 가상 함수를 반드시 하위 클래스에서 재정의(Override)하도록 강제한다.
이는
- 사용자(프로그래머)에게 이를 상속받는 클래스에서 특정 함수를 재정의 할 것을 알리는 역할,
- 인스턴스화가 불가능하다. 대신, 포인터로 하위 클래스를 가리킬 수 있다.
- 포인터로 하위 클래스의 인스턴스를 가리켜, 다형성을 지원하게 된다.
class Foo
{
public:
virtual void SomeFunction() = 0;
}
class Bar : public Foo
{
public:
virtual void SomeFunction() override
{
// Any Processing
OhYeah();
}
void OhYeah();
}
int main()
{
Foo* FooPtr = new Bar();
FooPtr->SomeFunction(); // 가상 함수 테이블을 통해 Bar에 정의된 SomeFunction()을 호출하게 된다.
return 0;
}
순수 가상 소멸자만 존재하는 클래스
그렇다면 순수 가상 소멸자만 존재하는 클래스(생성자는 순수 가상 함수가 될 수 없다)의 경우에 대해서 고려해 보자
class OnlyPureVirtualDestructor
{
public:
virtual ~OnlyPureVirtualDestructor() = 0;
}
OnlyPureVirtualDestructor::~OnlyPureVirtualDestructor()
{
}
왜 이런 형태의 클래스가 존재해야 할까? 그리고 하위 클래스에서 재정의하는 것인데 왜 또 소멸자를 직접 구현했을까?
순수 가상 소멸자 클래스의 필요성
- 추상 클래스로서의 역할 강조
- 인스턴스 생성 불가
- 공통 인터페이스 제공
- 다형성 지원
- 동적 바인딩 : 실제 호출되는 소멸자는 파생 클래스의 소멸자. 따라서 다형적인 소멸이 가능하게 한다.
- 안전한 메모리 관리
- 파생 클래스에서 할당한 자원들을 안전하게 해제하기 위해 소멸자를 재정의해야 함을 강제. 이로 인해 파생 클래스에서 할당한 자원들을 소멸시키도록 유도한다.
- 부모 클래스에 다른 함수를 순수 가상 함수를 두고 싶지 않을 때, 정확하게는 부모 클래스에 별도의 다른 역할이 필요 없을 때 사용한다.
순수 가상 소멸자를 구현한 이유
- 컴파일러는 소멸자가 반드시 구현되어 있을 것이라 가정하고 문법 검사를 수행한다. 따라서 구현하지 않는다면 컴파일 오류가 발생한다.
- 파생 클래스에서 재정의를 강제하기 위한 것으로 아무 일도 하지 않도록 하기 위해서
'TIL(Today I Learned)' 카테고리의 다른 글
| 24.12.27 TIL (0) | 2024.12.27 |
|---|---|
| 24.12.26 TIL (0) | 2024.12.26 |
| 24.12.23 TIL (1) | 2024.12.23 |
| 24.12.20 TIL (2) | 2024.12.20 |
| 24.12.19 TIL (2) | 2024.12.19 |