아카이빙/C, C++

가상함수(Virtual function)의 동작원리

셩님 2018. 5. 27. 04:33

가상함수(Virtual function)의 동작원리


클래스의 멤버 함수

  • 클래스의 멤버 함수는 클래스 내에 존재하지 않고, 메모리 어딘가에 저장된다.

  • 각 객체는 어딘 가에 저장된 멤버 함수를 공용으로 사용.



다음 과 같은 클래스가 있다고 하자.

class AAA:
{
public:
   virtual void Func1() { cout << "Func1()" << endl;}
   virtual void Func2() { cout << "Func2()" << endl;}
};

class BBB : public AAA
{
public:
virtual void Func1() { cout << "BBB:Func1()"" << endl;}
   void Func3() { cout << "Func3()" << endl;}
};


가상함수 테이블

  • 클래스에 한 개 이상의 가상함수를 포함하는 클래스는 클래스가 가상함수 테이블을 만든다.

  • 실제 호출 되어야할 함수의 위치 정보를 담고 있는 테이블

  • 클래스에 가상함수가 포함되면, 가상 함수 테이블이 생성되고, 이 테이블을 참조하여 함수를 호출하기 때문에 실행속도가 미미하게 감소한다.

AAA 클래스의 가상함수 테이블
key   | value
void AAA::Func1() | 0x1024 번지
void AAA::Func2() | 0x2048 번지


BBB 클래스의 가상함수 테이블
key   | value
void BBB::Func1() | 0x3072 번지
void AAA::Func2() | 0x2048 번지
void BBB::Func3() | 0x4096 번지
  • AAA 클래스와 BBB 클래스의 Func2는 같은 메모리 공간을 공유한다.

  • BBB 클래스의 가상함수 테이블에는 AAA 클래스의 Func1에 대한 정보가 없다.


참조

  • 윤성우, 열혈 C++ 프로그래밍, 오렌지미디어.


'아카이빙 > C, C++' 카테고리의 다른 글

상속에서 객체의 생성, 소멸과정  (0) 2018.05.27
malloc과 new의 차이  (0) 2018.05.27
struct와 class 차이  (0) 2018.05.27
strcpy와 strncpy  (0) 2018.05.27
string과 character 배열  (0) 2018.05.26