C++의 정적 바인딩과 동적 바인딩

#include <iostream>
class Base
{
public:
	void Call()
	{
		std::cout <<__LINE__<< __FUNCDNAME__ << "is called!" << std::endl;
	}
	virtual void Call(int a)
	{
		std::cout <<"Base::" <<__LINE__ << __FUNCDNAME__ << "is called!"<<a << std::endl;
	}
};
class Derived :public Base
{
public:
	void Call()
	{
		std::cout << __LINE__ << __FUNCDNAME__ << "is called!" << std::endl;
	}
	virtual void Call(int a)
	{
		std::cout << "Derived::" << __LINE__ << __FUNCDNAME__ << "is called!" << a << std::endl;
	}
};
int main()
{
	Derived * a = (Derived*) new Base();
	Base * b = new Derived;
	a->Call();
	b->Call();
	a->Call(5);
	b->Call(5);

	delete a;
	delete b;
    std::cout << "Hello World!\n"; 
}
  • 매개 변수가 없는 멤버함수 Call은 가상함수가 아니기 때문에 컴파일 타임에 포인터의 타입인 Derived인지 혹은 Based인지에 따라 호출된 함수 몸체가 결정된다.
  • 매개 변수가 있는 멤버함수 Call은 가상함수이기 때문에 실행 중에 객체의 vtable에 따라 호출될 함수 몸체가 결정된다.
23?Call@Derived@@QAEXXZis called!
11?Call@Base@@QAEXXZis called!
Base::15?Call@Base@@UAEXH@Zis called!5
Derived::27?Call@Derived@@UAEXH@Zis called!5
Hello World!