vfptr는 중요하다. C++ 동적 타입 시스템의 근간을 이루기 때문이다.
아래는 대화기록. 까까군의 프라이버시에 대한 항의가 들어오면 바로 삭제됨.
엄 자자.
엄 f가 A의 가상함수고, B가 A를 상속받았어.
엄 A*
b = new B();
엄 했어
엄 b->f()를 부르면..
엄 b는 A의 포인터임에도 불구하고
엄 B::f()를 부른단 말이지.
엄 얘는 어떻게 어떤 클래스의 함수를 부를지 결정하냐면;
엄
클래스마다, 그 클래스에서 선언된 가상함수를 가리키는
엄 함수포인터를 모아놓은 표가 있어.
엄 물론, 가상함수가
하나도 없는 클래스라면, 해당사항 없지.
엄 가상함수가 있는 클래스의 객체에는 클래스마다 있는 가상함수 테이블을
엄
가리키는 숨겨진 포인터 멤버가 하나 있어서
엄 생성자에서
엄 자기 클래스의 가상함수 테이블을 가리키도록 세팅한단
말야.
까까 질문이 있슴다.
까까 virtual 이 아니라면.
까까 A를
까까 B가 상속받아서
까까 A에더 move() 가 있고 B에도 move()가 있으면
까까 A의 포인터가 move()를 호출하면
까까 B의
move()는 동작 안되나요?
엄 엉.
엄 해당사항 없음.
엄 그럴땐 포인터의 타입을 따라가지.
까까 아하
까까 ..
까까 orz
까까 !쾅
까까 넵
엄 다른말로 하면,
엄 virtual 함수는
엄 "객체의 동적 타입에 따라 함수의 바인딩을 결정한다"는 지시어.
엄
non-virtual함수는
엄 "객체의 정적 타입에 따라 함수의 바인딩을 결정한다"가 기본이고.
엄 여튼, 그래서
엄 A의 가상함수 테이블에는
1 - A:: f()
2 - A:: g()
3 - O:: h()
엄 이렇게 있고
엄 B의
가상함수 테이블은, 이를테면
1 - B:: f()
2 - A:: g()
3 - O:: h()
엄 이렇게 구성되어 있는 거지.
엄 B타입의 객체를 만들구서 이놈의 f를 호출하겠다;고 하면
엄 컴파일러는
엄 가상함수 테이블의 1번
항목이 가리키는 함수를 찾아가서 호출.
까까 음 그렇군요
까까 그럼
까까 vfptr은
까까 같은 클래스면
까까 다 같겠네요?
엄 같은 클래스의 객체면
엄 항상 같지.