读下列程序:
#include<iostream>
using namespace std;
class B0
{
public:
virtual void print()
{
cout<<"B0::print()"<<endl;
}
};
class B11:public B0
{
public:
virtual void print()
{
cout<<"B11::print()"<<endl;
}
};
class B12:public B0
{
public:
virtual void print()
{
cout<<"B12::print()"<<endl;
}
};
class B2:public B0
{
public:
virtual void print()
{
cout<<"B2::print()"<<endl;
}
};
int main()
{
B0 b0,*p;
B11 b11;
B12 b12;
B2 b2;
int i;
cout<<"Input i(0,11,12,2,else ending!):";
cin>>i;
while(i==0||i==11||i==12||i==2)
{
switch(i)
{
case 0: p=&b0;
break;
case 11: p=&b11;
break;
case 12: p=&b12;
break;
case 2: p=&b2;
break;
}
p->print();
cout<<"Input i(0,11,12,2 else ending!):";
cin>>i;
}
return 0;
}
结果显示:
Input i(0,11,12,2,else ending!): 2
B2::print()
Input i(0,11,12,2,else ending!):11
B11::print()
Input i(0,11,12,2,else ending!):12
B12::print()
Input i(0,11,12,2,else ending!):
B0::print()
Input i(0,11,12,2,else ending!):3
press anykey to continue
解析:
动态联编是与虚函数以及程序中使用指向基类的指针(变量)密切相关的。注意,C++规定,基类指针可以指向其派生类的对象
(即可将派生类对象的地址赋给其基类指针变量),但反过来不可以。允许基类指针指向其派生类对象--这一点正是函数超载及
虚函数用法的基础。本范例程序中,说明了一个纸箱基类的指针p,而后通过"p= 某派生类的类对象地址;"使p指向了不同的
派生类,再接着使用"p->print();"去对虚函数print()进行调用,系统将视基类指针p所指对象的不同而调用不同类的print。