C++上机实验报告6

更新时间:2023-11-14 12:02:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C++实验报告

实验六 多态性 实验目的

1.掌握运算符重载的方法

2.学习使用虚函数实现动态多态性 实验要求

1.定义Point类,有坐标_x,_y两个成员变量;对Point类重载“++”(自增)、“――”(自减)运算符,实现对坐标值的改变。

2.定义一个车(vehiele)基类,有Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类,从bicycle和motorcar派生出摩托车(motorcycle)类,它们都有Run、Stop等成员函数。观察虚函数的作用。

3. (选做)对实验4中的People类重载“==”运算符和“-”运算符,“==”运算符判断两个people类对象的id属性是否相等;“-”运算符实现People类对象的赋值操作。 实验内容及实验步骤

1编写程序定义Point类,在类中定义整型的私有成员变量_x_y,定义成员函数Point& operator++();Point operator++(int);以实现对Point类重载“++”(自增)运算符,定义成员函数Point& operator--();Point operator--(int);以实现对Point类重载“--”(自减)运算符,实现对坐标值的改变。程序名:1ab8_1.cpp。 源代码:

#include using namespace std;

class Point {

private: double _x,_y; public: Point(){_x=0;_y=0;} Point(double x,double y){_x=x;_y=y;} Point& operator++(); Point operator++(int); Point& operator--(); Point operator--(int); void show(); };

void Point::show() { cout<<\}

Point& Point::operator ++() { _x=_x+1; _y=_y+1; return *this; }

Point Point::operator++(int) { Point old=*this; ++(*this); return old; }

Point& Point::operator --() { _x=_x-1; _y=_y-1; return *this; }

Point Point::operator--(int) { Point old=*this; --(*this); return old; }

int main() {

Point a(2,3); (a++).show(); (++a).show(); a.show(); (a--).show(); (--a).show(); a.show(); return 0; }

运行结果:

2.编写程序定义一个车(vehicle)基类,有Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类,从bicycle和motorcar派生出摩托车(motorcycle)类,它们都有Run、Stop等成员函数。在main()函数中定义vehicle、bicycle、motorcar、motorcycle的对象,调用其Run()、Stop()函数,观察其执行情况。再分别用vehicle类型的指针来调用这几个对象的成员函数,看看能否成功;把Run、Stop定义为虚函数,再试试看。程序名:lab8_2.cpp。 源代码:

#include using namespace std;

class vehiele {

public: virtual void Run() { cout<<\ } virtual void Stop() { cout<<\ } };

class bicycle:virtual public vehiele {

public:

virtual void Run()

{ cout<<\ } virtual void Stop() { cout<<\ } };

class motorcar:virtual public vehiele {

public: virtual void Run() { cout<<\ } virtual void Stop() { cout<<\ } };

class motorcycle:public bicycle,public motorcar {

public: virtual void Run() { cout<<\ } virtual void Stop() { cout<<\ } };

void show(vehiele*ptr) { ptr->Run(); ptr->Stop(); }

int main() { vehiele a;

}

bicycle b; motorcar c; motorcycle d; show(&a); show(&b); show(&c); show(&d); return 0;

运行结果:

思考题

1. 如何将一个运算符重载为类的成员函数?

当运算符重载为类的成员函数时,函数的参数个数比原来的操作数要少一个(后置单目运算符除外),这是因为成员函数用this指针隐式地访问了类的一个对象,它充当了运算符函数最左边的操作数。因此:

(1) 双目运算符重载为类的成员函数时,函数只显式说明一个参数,该形参是运算符的右操作数。

(2) 前置单目运算符重载为类的成员函数时,不需要显式说明参数,即函数没有形参。

2. 如何将一个运算符重载为类的友元函数?

当运算符重载为类的友元函数时,由于没有隐含的this指针,因此操作数的个数没有变化,所有的操作数都必须通过函数的形参进行传递,函数的参数与操作数自左至右一一对应

3. 如何实现运行时刻的多态?

C++使用vtable(虚成员函数表)来实现虚成员函数的运行期绑定。虚成员函数表存在的用途是支持运行时查询,使得系统可以将某一函数名绑定到虚成员函数表中的特定入口地址。需成员函数表的实现是与系统无关的。 使用动态绑定的程序会影响效率,因为虚成员函数表需要额外的存储空间,而且对虚成员函数表进行查询也需要额外的时间。

纯面向对象语言由于所有的函数都以动态方式运行,因而效率的降低会相当大,而在C++中,程序员可以选择性的执行哪些函数是虚成员函数,因而既不会导致太大的效率降低,又充分利用了运行期绑定机制

2. 如何将一个运算符重载为类的友元函数?

当运算符重载为类的友元函数时,由于没有隐含的this指针,因此操作数的个数没有变化,所有的操作数都必须通过函数的形参进行传递,函数的参数与操作数自左至右一一对应

3. 如何实现运行时刻的多态?

C++使用vtable(虚成员函数表)来实现虚成员函数的运行期绑定。虚成员函数表存在的用途是支持运行时查询,使得系统可以将某一函数名绑定到虚成员函数表中的特定入口地址。需成员函数表的实现是与系统无关的。 使用动态绑定的程序会影响效率,因为虚成员函数表需要额外的存储空间,而且对虚成员函数表进行查询也需要额外的时间。

纯面向对象语言由于所有的函数都以动态方式运行,因而效率的降低会相当大,而在C++中,程序员可以选择性的执行哪些函数是虚成员函数,因而既不会导致太大的效率降低,又充分利用了运行期绑定机制

本文来源:https://www.bwwdw.com/article/ov1v.html

Top