#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!