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

다메즈마 (토론 | 기여)님의 2018년 11월 20일 (화) 11:45 판 (새 문서: 분류:프로그래밍 <source lang="cpp"> #include <iostream> class Base { public: void Call() { std::cout <<__LINE__<< __FUNCDNAME__ << "is called!" << std::endl; } virtua...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)
#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!