class Parent{
int age;
public:
void func(){} //static func
virtual void v_func(){} // dynamic func
}
class Child : public Parent{
public:
void func(){//change}
virtual void v_func(){//change}
}
int main(){
Parent p;
Child c;
Parent* pS = &c;
pS->func(); // parent 호출
pS->func2();// child 호출
}
포인터 Base(기반) 클래스를 선언하고 해당 인자가 Dervied(파생) 클래스를 가리키고 delete를 하게 되면, 선언한 인자가 포인터 Base(기반) 클래스이기 때문에 Derived(파생) 클래스 소멸자는 생성되지 않고, Base(기반) 소멸자만 호출된다.
class Base{
public :
Base(){}
~Base(){}
};
class Derived : public Base{
public:
Derived(){}
~Derived(){}
};
int main(){
Base* b = new Derived;
delete b; // 이 경우 Base 소멸자만 호출이 된다.
}
소멸자 호출시 포인터 타입이 아닌 Base(기반) 클래스 인자가 가리키는 메모리를 조사 후 호출해야 한다.
Base(기반) 클래스의 소멸자를 가상함수로 해야한다.
class Base{
public :
Base(){}
virtual ~Base(){} // 이렇게 virtual!!!!!!!!!
};