클래스의 상속을 사용함으로써 소멸자를 가상함수로 만들어야 한다. 아래 코드를 실행하고 문제점을 발견할 수 있다.
#include <iostream>
class Parent {
public:
Parent() { std::cout << "Parent 생성자 호출" << std::endl; }
~Parent() { std::cout << "Parent 소멸자 호출" << std::endl; }
};
class Child : public Parent {
public:
Child() : Parent() { std::cout << "Child 생성자 호출" << std::endl; }
~Child() { std::cout << "Child 소멸자 호출" << std::endl; }
};
int main() {
std::cout << "--- 평범한 Child 만들었을 때 ---" << std::endl;
{ Child c; }
std::cout << "--- Parent 포인터로 Child 가리켰을 때 ---" << std::endl;
{
Parent *p = new Child();
delete p;
}
}
지금까지 구현한 내용을 보면 default로 모든 함수를 virtual로 만들면 되지 않을까? 라는 의문이 생긴다. 하지만 이는 가상함수를 사용하게 되면 약간의 오버헤드(overhead)가 존재하기 때문에 사용하지 않는다.
class Parent {
public:
virtual void func1();
virtual void func2();
};
class Child : public Parent {
public:
virtual void func1();
void func3();
};
Parent* p = Parent();
p->func1();
p
가 Parent
를 가리키는 포인터 이니, func1()
의 정의를 Parent
클래스에서 찾음func1()
이 가상함수임을 인지func1()
을 직접실행하지 않고, 가상함수 테이블에서 func1()
에 해당하는 함수를 찾음Parent::func1()
를 호출=0;
으로 처리되어있는 가상함수class A {
public:
int a;
};
class B {
public:
int b;
};
class C : public A, public B {
public:
int c;
};