상속관계에서 dynamic polymorphism을 만들어주는 virutal function/table


실행해보면 8bytes, 16bytes가 나오는데 speak()함수에 virtual과 override를 붙이면
#include <iostream>
class Animal
{
public:
virtual void speak()
{
std::cout << "Animal" << std::endl;
}
virtual ~Animal()=default;
private:
double height; // 8bytes
};
class Cat : public Animal
{
public:
void speak() override
{
std::cout << "meow~" << std::endl;
}
private:
double weight; // 16bytes
};
int main()
{
Animal * polyAnimal = new Animal();
polyAnimal->speak();
delete polyAnimal;
return 0;
}

로 변하는데 address정보가 추가로 들어가기 때문이다.


64bits컴퓨터이므로 포인터인 address정보는 8bytes이다.
이 포인터들은 Animal::speak() 함수와 Cat::speak() 함수를 가리킨다.

Animal polyAnimal = new Animal();
을 프로세스 메모리에서 보면

stack에서 포인터 polyAnimal은 heap에 있는 객체를 가리킨다
heap의 객체안에 들어있는 virtual table의 주소를 가리키는 포인터는 Animal();로 선언했으니
Animal virtual table을 가리킨다
만약 Animal * polyAnimal = new Cat();이라하면
Cat virtual table을 가리킨다