Post

가상함수와 추상클래스

가상함수와 추상클래스

가상함수

가상함수는 virtual 키워드가 붙은 함수이며, 자식 클래스에서 정의할 멤버 함수 입니다.
부모 클래스의 포인터나 레퍼런스가 자식 클래스 객체를 가리킬 때,
자식 클래스에서 의 가상함수 재정의에 의해 호출되는 함수가 달라지게 합니다.


객체의 가상 함수 포인터를 통해 클래스의 가상 함수 테이블에 접근합니다.
vtable 안의 함수 포인터를 호출하는식으로 동작.



Q. 추상클래스는 무엇이고 왜 사용하는가?
Q. 생성자/소멸자에서 virtual 함수 호출시?

  • 해당 시점에 파생 클래스 부분은 초기화되지 않음.
  • 따라서 기본 클래스의 버전만 호출됨 → 다형성이 깨짐.
  • 생성자/소멸자 내에서는 virtual 호출을 지양.

Q. 추상클래스와 인터페이스의 차이점?
Q. 추상 클래스도 인터페이스라고 말할 수 있는데 왜 인터페이스가 아니라 추상클래스인가?
Q. 왜 추상클래스는 인스턴스화 할 수 없는가?
Q. 클래스와 인스턴스의 차이?
Q. 가상 테이블?
Q. 가상 함수?
Q. 컴파일러는 가상함수를 어떻게 처리하는가?

  • 컴파일러는 가상 함수 테이블(VTable)VTable 포인터(vptr)를 클래스에 생성.
  • 객체 생성 시 vptr이 실제 타입의 VTable을 가리키고,
  • 가상 함수 호출은 vptr을 통해 간접 호출되어 다형성 구현.

Q. 오브젝트가 있고, 오브젝트에서 가상함수를 선언했다. 그걸 상속받는 몬스터가 있다. 몬스터가 100마리 있다고 치자. 몬스터가 어택함수를 썼다. 그러면 몬스터가 100마리니까 가상테이블도 100개일까?
Q. 가상 테이블은 어느 메모리 영역에 존재하는가?

This post is licensed under CC BY 4.0 by the author.