까까 vfptr이 뭔가요;
엄 버추얼펑션테이블을 가리키는 포인터.
(어색한 침묵)
엄 버추얼 펑션 테이블이 뭔지 모른다거나;;?
까까 ..
까까 네 -ㅅ-;;
엄 버추얼 펑션은 아냐?
까까 음
까까 ..
까까 그거
까까 앞에 virtual 해서
까까 상속받아서 쓰는 물건 아닌가요
엄 그럼 그놈이 어떻게 구현될 거 같아?
까까 음
까까 ...
까까 글쎄요;
엄 자자.
엄 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은
까까 같은 클래스면
까까 다 같겠네요?
엄 같은 클래스의 객체면
엄 항상 같지.