개발 언어/cpp
CPP 부모클래스에서 virtual 함수가 하나라도 있으면 소멸자도 무조건 virtual?
eeeun:)
2022. 3. 10. 12:34
반응형
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