반응형
cpp 공부를 하며 여러 가지 테스트를 진행 중, 이상한 상황을 발견했다!
class A {
A() {};
~A() {};
virtual void test1() {};
};
class B : A {
}
int main() {
A a = new B();
delete a;
}
위와 같이 코드를 적었을 때 컴파일 오류가 난다.
원래 업 캐스팅을 할 때는 자식 클래스의 소멸자가 호출되지 않기 때문에 부모 클래스의 소멸자를 virtual로 설정해서 가상 함수 테이블을 만들어 줘야 된다.
부모 클래스의 소멸자를 virtual로 설정하는 것이 좋다~이지 필수는 아니라고 알고 있어서 위의 코드에서 컴파일 오류를 마주했을 때 왜 오류가 뜨는지 몰랐다.
밑에 코드와 같이 A class(부모)에서 virtual 함수가 없으면 오류가 나지 않는다.
class A {
A() {};
~A() {};
void test1() {};
};
class B : A {
}
int main() {
A a = new B();
delete a;
}
문법으로 정해져 있는 건지 컴파일러가 똑똑하게 잡아주는 것인지 검색해도 잘 나오지 않아.. 아직 확신할 수는 없지만,
메인 문에서 B class(자식)에서 A class(부모)로 업 캐스팅을 하는데 이것을 컴파일러가 인지해서 컴파일 오류로 체크하는 것 같다.
728x90
'개발 언어 > cpp' 카테고리의 다른 글
CPP 4가지 타입 변환 연산자 (Casting) (0) | 2022.03.20 |
---|---|
CPP template (0) | 2022.03.18 |
:: Scope Operator(범위 지정 연산자)를 쓰는 3가지 상황 (0) | 2022.02.15 |
CPP Enum(enumerate) (0) | 2022.01.19 |
CPP STL 맵(Map) (0) | 2022.01.18 |
댓글