/*
C++编译器在编译时刻创建了所有必需的虚函数表。并且,每个虚函数表中的项都已经填充了恰当的值(指向了正确的函数入口)。如果子类实现了某个虚函数,当把子类对象指针赋值给父类对象指针时,那么这个函数入口地址就会被子类的函数地址覆盖。
*/
#include "stdafx.h"
#include <iostream>
using namespace std;
class Base
{
public:
virtual void fn1() {cout<<"Base::fn1()"<<endl;}
virtual void fn2() {cout<<"Base::fn2()"<<endl;};
virtual void fn3() {cout<<"Base::fn3()"<<endl;}
};
class Derived: public Base
{
public:
//virtual void fn1() {cout<<"Derived::fn1()"<<endl;}
virtual void fn2() {cout<<"Derived::fn2()"<<endl;}
void fn3() {cout<<"Derived::fn3()"<<endl;}
virtual void fn4() {cout<<"Derived::fn4()"<<endl;}
};
class Derived2: public Derived
{
public:
virtual void fn3() {cout<<"Derived2::fn3()"<<endl;}
void fn4() {cout<<"Derived2::fn4()"<<endl;}
void fn5() {cout<<"Derived2::fn5()"<<endl;}
};
int _tmain(int argc, _TCHAR* argv[])
{
Derived2 * dr2 = new Derived2;
Derived * dr = new Derived;
Base * base = NULL;
base = dr2;
base->fn3();
dr2->fn3();
cout << endl;
base = dr;
base->fn3();
base->fn1();
base->fn2();
return 0;
}