C实验十一虚函数.docx
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验十一虚函数
一、实验目的
1)掌握虚函数的定义和使用
2)掌握抽彖类的定义和使用
3)掌握纯虚函数的定义
4)掌握虚析构函数、纯虚函数和抽象类的作用
二、实验原理
1.利用虚函数的作用:当编译器编译虚函数吋,编译系统将用动态连接的方式进行编译。即在编译时不确定该虚函数的版本,而是利用一种机制在运动过程屮根据其所指向的实例决定使用哪一个函数版本。
2.利用虚析构函数的原则:当将基类指针或引用new运算符指向派生类对象时, 为了在释放派牛类对象时能调用派牛类的析构函数,必须将基类的析构函数定义为虚函数。
3.抽彖类的作用:为它的所有派生类提供一个公共接口,纯虚函数是定义抽彖类的一种间接手段。
三、实验设备
实验室里调备的计算机、window xp,visual c++6.0
四、实验内容
4.1分析下面各题程序,按各题的要求进行实验
1)分析下面的程序,指出程序运行的结果:
# include
class CBase
{public:
virtual void fl() 〃将成员函数fl()声明为虚函数
{cout«n调用函数CBase::fl()!H«endl;}
virtual void f2() 〃将成员函数f2()声明为虚函数
{cout«"调用函数CBase::f2()!"«endl;}
void f3() //一般成员函数
{cout«n调用函数CBase::f3()!H«endl;}
};
class CDerived:public CBase 〃公有继承CBase
{void fl()
{cout«n调用函数CDerived::fl()!M«endl;}
void f2()
{cout«n调用函数CDerived::f2()!M«endl;}
void f3()
{cout«"调用函数CDerived::f3()! "«endl;}
};
void main()
{CBase objl,*p; 〃定义CBase的对象objl和指针对象p
CDerived obj2; 〃定义CDerived 的对彖obj 1
p=&objl;//将objl的地址给p
p->fl();〃通过p调用基类版本的fl()函数
p->f2(); 〃通过p调用基类版本的f2()函数p->f3(); 〃通过p调用基类版本的f3()函数p=&obj2;//将派生类对象obj2的地址赋给p p->fl();〃动态连接,调用派生类版本
p->f2();〃动态连接,调用派生类版木p->f3(); // 调用基类版本
运行的结果:
2)分析下面的程序,指出程序运行的结果:
#include
class CBase
{public:
CBase() //CBase类的构造函数
{cout«M调用构造函数CBase()!u«endl;
fun();} 〃构造函数屮调用虚函数fun()
virtual void fun() 〃定义虚函数
{cout«"调用构造函数CBase::fun()!"«endl;}
};
class CDerived:public CBase
{public:
CDerived() //CDerived 类的构造函数
{cout«"调用构造函数CDerived()! "«endl;
fun();} 〃构造函数中调用虚函数fun()
void fun()
{cout«H调用构造函数CDerived::fun()!H«endl;}
};
void main()
{CDerived d; 〃创建对象
d.fun();
}
运行结果:
3)分析下面的程序,指出程序的错误
# include
#include
{protected:
char *ch;
public:
CBase(char *x)
{ch二new char[20];
strcpy(ch,x);
}
virtual void fun()=0;
virtual void fun 1() {cout«x«endl;}
〃虚函数
{cout«ch«endl;) ~CBase()
{delete[]ch; cout«"~CBase()"«endl;
}
};
class CDerived:public CBase
{protected:
char *ch;
public:
CDerived (char *x,char*y):CBase(y) {ch=new char[20];
strcpy(ch,x);}
void fun 1()
// {cout«x«endl;J {cout«ch«endl;) Virtual ~CDerived()
{delete[]ch; cout«H-CDerived()n«endl;} };
void main()
{CBase objl(n Hello n),*p;
p=&obj 1;
p->funl();
p->fun();
p=new CDerived(” ChinaTHello”);
p->funl();
p->fun();
delete p;
运行结果:
4. 2编写并调试程序
1)编写一个程序计算三角,正方形和圆形的面积。
分析:依题意,可以抽象出一个基类CBase,在其中说明一个虚函数,用來求面积,并利用单接口、多实现版本设计各个图形求面积的方法。(参考教材P2095.25)
源程序:
运行结果: