티스토리 뷰
반응형
Override
예전 C++에서 상속받은 함수를 재정의 할때 만약 오타가 났다면
그냥 그대로 해당 클래스에 메서드가 생겨버리는 문제가 있었다.
이를 해결하기 위해서 override라는 키워드가 생겼다.
#include <iosteam>
class Base
{
public:
virtual void foo() {}
virtual void goo(int) {}
};
class Derived : public Base
{
public:
void foo() override {}
void goo(int a) override {}
void fooo() override {} // error
void goo(double) override {} // error
};
다음과 같이 사용하면, 함수의 이름이 틀렸거나 인자의 자료형이 다르다면 오류가 난다.
상황에 따라서 쓰는게 아닌 무조건 쓰도록 하는 것을 권장한다.
가상 소멸자
만약, upcasting을 한 뒤 기반 클래스 포인터를 삭제할 때, 캐스팅된 자식 클래스도 소멸이 잘 될까?
컴파일러는 기반클래스라는 것만 알고 있기 때문에 삭제 되지 않는다.
그래서 우리는 기반클래스의 소멸자를 가상 함수로 만들어야 한다.
기반 클래스의 소멸자가:
- 1. 가상함수가 아닐 경우: 무조건 기반 클래스 소멸자 호출
- 2. 가상함수일 경우: 포인터가 가리키는 메모리를 조사후 소멸자 모두 호출
#include <iostream>
class Base
{
public:
Base() {}
//~Base(){}
virtual ~Base(){} // 기반 클래스는 소멸자가 가상함수 이어야 한다.
};
class Derived : public Base
{
public:
Derived() { std::cout << "Derived()" << std::endl;}
~Derived() { std::cout << "~Derived()" << std::endl;}
};
int main()
{
Derived* p1 = new Derived;
delete p1;
Base* p2 = new Derived;
delete p2; // 만약 Base의 소멸자가 가상함수가 아니라면
// 캐스팅된 Derived 객체는 소멸되지 않는다
}
728x90
반응형
'Programming_language > C, C++' 카테고리의 다른 글
[C++ Design Pattern] 5. Template Method Pattern (0) | 2021.11.13 |
---|---|
[C++ Design Pattern] 4. 추상 클래스 (0) | 2021.11.13 |
[C++ Design Pattern] 2. upcasting (0) | 2021.11.13 |
[C++ Design Pattern] 1. 생성자 (0) | 2021.11.13 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 리액트
- API
- broker
- Firebase
- feign client
- consumer
- React
- Java
- centos
- NextJS
- Producer
- docker
- spring boot
- Linux
- spring
- rhel
- apache kafka
- Front
- logback
- OS
- 프론트엔드
- K8S
- KAFKA
- cs
- apache
- Data Engineering
- zookeeper
- Container
- JPA
- frontend
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함
250x250