实验五 Shape虚基类
一、实验目的
1.掌握虚基类的定义、使用
2.理解使用虚函数和继承类实现多态性
二、实验环境
Windows + VC++6.0。
三、实验内容及要求
定义抽象基类Shape,有它派生出三个类:Circle、Rectangle、Triangle,用函数ShowArea 分别显示各种图形的面积,最后还要显示所有的图形面积。
要求用基类指针数组,使他的每一个元素指向一个派生类对象。
四、实验步骤
(1) 定义一个虚基类Shape,在ShowArea函数声明前冠以virtual使其成为虚函数,并且能够在派生类中重定义。
(2)定义三个派生类Circle、Rectangle、Triangle,并公有继承Shape基类。
(3)在主函数中分别调用三个派生类的ShowArea函数,求出各个形状的面积。
(4)定义一个基类指针数组p[3]={&A,&B,&C},通过->访问派生类对象
的成员函数ShowArea,如p[0]->ShowArea()访问的是对象A的成员函数。
五、程序分析
1.抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。
如果派生类中没有重新定义纯虚函数,而只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。
如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体的类。
2.如果派生类重写了基类的虚函数,那么编译器对应的操作为将指向虚函数表的指针__vfptr指向的函数指针数组中相应的虚函数入口地址改变为当前派生类实现的函数入口地址;
基类指针指向派生类后,实际上指向的是从基类派生到派生类那段成员的首地址(存放__vfptr,如果定义有虚函数),基类指针在调用虚函数的额时候,是通过查该__vfptr地址指向的函数指针数组来查找函数入口地址。
所以,如果派生类重写了虚函数,那么以上查找的虚函数的入口地址将是派生类重写的函数的入口地址。
六、实验结果与总结
实验总结:
抽象基类与普通基类不同,他平不是现实存在的对象,它可以没有任何物理上的或其他实际意义方面的含义,例如Shape类,只有一个成员函数,没有数据成员。
它既不代表点,也不代表圆。
实验结果如下:
实验总结:
1.抽象基类与普通基类不同,他平不是现实存在的对象,它可以没有任何物
理上的或其他实际意义方面的含义,例如Shape类,只有一个成员函数,没有数据成员。
它既不代表点,也不代表圆。
对于虚函数,在基类用Virtual申明成员函数为虚函数。
这样就可以在派生类中重新定义此函数,为他赋新功能,并能方便的调用。
2.抽象基类是本类族的公共接口。
或者说,从同一基类派生出的多个类有同
一接口。
因此能响应同一形式的消息(例如各类对象都有能对用基类指针调用虚函数作出响应),但是相应的方式因对象不同而异。
在通过虚函数实现动态多动性时,可以不必考虑对象是哪一个类派生出来的,都用同一种方式调用(因为基类指针可以指向同一类组的所有类,因而可通过基类指针调用不同类的虚函数)。
附1:完整的原程序。