#include <iostream.h>
class Person
{ int i;
public:
void f()
{cout<<" Person::f()"<<endl;}
virtual void g(double x)
{cout<<" Person::g(double)"<<endl;}
Person (int x):i(x)
{cout<<" Person Construction"<<endl;}
~ Person ()
{cout<<" Person Destruction"<<endl;}
};
class Graduate:public Person
{ int j;
public:
virtual void f()
{cout<<" Graduate::f()"<<endl;}
void g(int x)
{cout<<" Graduate::g(int)"<<endl;}
Graduate (int x, int y): Person (x),j(y)
{cout<<" Graduate Construction"<<endl;}
virtual ~ Graduate ()
{cout<<" Graduate Destruction"<<endl;}
};
class PostGraduate:public Graduate
{ int k;
public:
void f()
{cout<<" PostGraduate::f()"<<endl;}
void g(double x)
{cout<<" PostGraduate::g(double)"<<endl;}
PostGraduate (int x, int y, int z): Graduate (x,y),k(z)
{cout<<" PostGraduate Construction"<<endl;}
~ PostGraduate ()
{cout<<" PostGraduate Destruction"<<endl;}
};
void convert1(Graduate ** qq, const Person * const pp)
{
*qq =( Graduate *)pp;
}
void convert2(PostGraduate ** rr, Person* const pp)
{
*rr =( PostGraduate *)pp;
}
void main()
{ Person *p = new PostGraduate (1,2,3);
//1-3 依次调用顶层基类Person::Person,中间层父类\Graduate::Graduate,和自身派生类
//PostGraduate::PostGraduate构造
Graduate *q; PostGraduate *r;
convert1(&q,p); convert2(&r,q);
//这里看到传入了变量的地址,就知道函数内是要改变r和r(指针的首要作用是函数内修改一个外部变量)。
p->f(); //4 (*p)是Person类型,f非虚,静态绑定
p->g(double(3.5));//5 (*p)是Person类型,在Person中找到一个g可以绑定,发现是虚函数,推迟,最后运行时绑定和调用派生类对象PostGraduate::g(double)
p->g(int(3.5));//6 同上,但运行时发生隐式类型转换(int-)double)
q->f();//7 ,(*q)是Graduate类型,在Graduate中找到f,但发现是虚函数,推迟,最后运行时绑定和调用派生类对象PostGraduate::f。
q->g(double(3.5)); //8 (*q)是Graduate类型,在Graduate中找到g(int)可以相容,编译绑定成功,运行时发生隐式类型转换(double->int)
q->g(int(3.5)); //9 同上。(*q)是Graduate类型,在Graduate中找到g(int)可以相容,绑定成功
r->f();//10 (*r)是PostGraduate类型,在PostGraduate中找到f,上翻发现Graduate的同型为虚,推迟,运行时再绑定调用PostGraduate::f()。
r->g(double(3.5));//11 (*r)是PostGraduate类型,在PostGraduate中找到g(double),连续上翻发现在Person中声明该型为虚,推迟,运行时绑定调用PostGraduate::g(double)
r->g(int(3.5));//12 同上。(*r)是PostGraduate类型,在PostGraduate中没有g(int),但找到g(double)相容,连续上翻发现在Person中声明该型为虚,推迟,运行时隐式类型转换(PostGraduate::g(double)),绑定调用PostGraduate::g(double)
delete q;// 13-15 (*q)是Graduate类型,在Graduate找到,发现是virtual,推迟,运行时绑定调用派生类PostGraduate::,在PostGraduate::析构函数尾部自动调用父类Graduate::,在Graduate::析构函数尾部自动调用父类Person::。即按照栈序依次释放。
}//以上一共15行输出,以1-15给出了解释。结果如下:
Person Construction
Graduate Construction
PostGraduate Construction
Person::f()
PostGraduate::g(double)
PostGraduate::g(double)
PostGraduate::f()
Graduate::g(int)
Graduate::g(int)
PostGraduate::f()
PostGraduate::g(double)
PostGraduate::g(double)
PostGraduate Destruction
Graduate Destruction
Person Destruction