본문 바로가기
개발 언어/cpp

CPP 부모클래스에서 virtual 함수가 하나라도 있으면 소멸자도 무조건 virtual?

by eeeun:) 2022. 3. 10.
반응형

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

댓글