C++ 함수 binding

jaeha_lee·2022년 5월 12일
0

함수 바인딩: class->method() / 어느 함수와 연결할지를 결정하는 과정

  • static binding(early binding)
    • 컴파일러가 컴파일 시간에 함수 호출을 결정
    • 컴파일러는 실제로 어느 객체를 가리키는지 컴파일 시간에 알 수 없음
    • 포인터 타입만을 가지고 함수 호출을 결정
  • dynamic binding (late binding)
    • 컴파일 시간에 가리키는 곳을 조사하는 기계어 코드 생성
    • 실행 시간에 가리키는 곳을 조사한 후 실제 메모리에 있는 객체에 따라 함수 호출 결정

Virtual func vs non-virtual func

  • Virtual func : 선언부에 virtual 붙은 멤버 함수
  • non-Virtual func : virtual을 붙이지 않은 멤버 함수
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 호출
}

Virtual func 언제 사용?

파생 클래스가 재정의 하게 되는 멤버 함수는 반드시 가상 함수 (Virtual)로 만들어야 합니다. → 가상 함수가 아닌 함수를 재정의하지 않는다!!!

가상함수 재정의

  • 가상함수를 재정의 할때는 virtual 안붙여도 됨
  • 가상 함수 재정의시 override를 붙이는 것 좋음

소멸자 ( 중요 )

  • 포인터 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!!!!!!!!!
      };
    

0개의 댓글