virtual table

김대익·2022년 3월 7일

상속관계에서 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을 가리킨다

0개의 댓글