虚函数

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值