nakka soft world !
함수 바인딩과 가상함수의 원리 본문
함수 바인딩과 가상함수의 원리
함수 바인딩 (function binding)
class Animal
{
public:
void Cry() {}
};
class Dog : public Animal
{
public:
void Cry() {}
};
int main()
{
Animal* p = 0;
p = new Dog;
int n;
cin >> n;
if (n == 1)
p = new Animal;
// 이순간 컴파일러는 p가 누구를 가리키는지 알수 있을까?
p->Cry(); // 함수 바인딩 (function binding)
}
// 1. static binding : 컴파일 시간에 컴파일러가 결정하는 것. 포인터 타입으로 결정. Animal Cry 호출. 속도가 빠름.
// C++ 일반 멤버 함수.
// 2. dynamic binding : p가 가리키는 메모리를 조사하는 기계어 코드 생성. 실행시간 조사 후 호출.
// C++ virtual function, java, object-C
가상함수의 원리 - 가상함수 테이블
class Animal
{
private:
int age;
public:
virtual void Cry() {}
virtual void Run() {}
};
class Dog : public Animal
{
private:
int color;
public:
virtual void Cry() {}
};
int main()
{
Animal a;
Dog d;
cout << sizeof(a) << endl; // 8
cout << sizeof(d) << endl; // 12
Animal* p = &d;
p->Cry(); // p->vtptr[1]() 라는 기계어 코드 생성
}
가상함수의 단점
1. 약간의 성능저하. function call하면 direct call하는데 주소를 한번 찾아야 해서 잠깐 느림
2. inline 못씀
'프로그래밍언어 > C++' 카테고리의 다른 글
다중 상속 (multiple inheritance), 다이아몬드 상속 (0) | 2017.03.27 |
---|---|
RTTI ( Rut Time Type Information ) , dynamic_cast (0) | 2017.03.27 |
추상클래스와 인터페이스 (0) | 2017.03.27 |
순수 가상 함수와 추상 클래스 (0) | 2017.03.27 |
가상 소멸자 ( virtual destructor ) (0) | 2017.03.27 |