C++ 面向对象 - 类的多态性与虚函数
一、实训目的
1.掌握虚函数的基本使用。
2.掌握虚析构函数的使用。
3.掌握纯虚函数和抽象类的使用。
二、实训内容
1.人与复读机
设计人类、英语学生类和复读机类三个类。
2.复读机的毁灭
设计三个复读机类并实现一个普通函数。
3.计算图像面积
设计一个矩形类、一个圆形类和一个图形基类,计算并输出相应图形面积。
三、实训所实现系统主要功能
1.人与复读机
人类( Chinese )
它有一个虚函数 greet,函数输出中文问候,即你好。
英语学生类( EnglishLearner )
继承 Chinese 类,重写 greet 函数,访问性为 public,输出英文问候,即Hello。
复读机类( Repeater )
继承 Chinese 类,以 public 访问性重写 greet 函数,函数调用 Chinese 类的 greet 函数。
2.复读机的毁灭
复读机类( Repeater )
它有一个成员函数 Play,在这里它什么也不做。它还有一个析构函数,它被调用时会输出一行 砰!。
正向复读机类( ForRepeater )
继承 Repeater 类并重写 Play 函数,输出没想到你也是一个复读机且在析构函数中输出正·复读机 炸了。
反向复读机类( RevRepeater )
继承 Repeater 类也重写 Play 函数,输出机读复个一是也你到想没且在析构函数中输出机读复·反 炸了。
普通函数:Repeater* CreateRepeater(int type),函数根据 type 的值,动态创建不同的复读机对象,并返回它的指针。其中当type = 0,创建 ForRepeater 对象;type = 1,创建 RevRepeater 对象;其他则返回 0。
3.计算图像面积
图形类( shape )
纯虚函数:void PrintArea(),用于输出当前图形的面积。
矩形类( Rectangle )
继承 Shape 类,并且重写 PrintArea 函数,输出矩形的面积,输出格式为:矩形面积 = width*height。
带参构造函数:Rectangle(float w,float h),这两个参数分别赋值给成员变量的宽、高。
圆形类( Circle )
继承 Shape 类,并且重写 PrintArea 函数,输出圆形的面积,输出格式为:圆形面积 = radio * radio * 3.14。
带参构造函数:Circle(float r),参数 r 代表圆的半径。
四、实训系统核心代码及必要说明
1.人与复读机
/********* Begin *********/
class Chinese
{
//人类的声明
public:
virtual void greet();
};
//人类的定义
void Chinese:: greet(){
cout << "你好" << "\n";
}
class EnglishLearner : public Chinese
{
//英语学生类的声明
public:
virtual void greet();
};
//英语学生类的定义
void EnglishLearner :: greet(){
cout << "Hello" << "\n";
}
class Repeater : public Chinese
{
//复读机类的声明
public:
virtual void greet();
};
//复读机类的定义
void Repeater :: greet(){
Chinese:: greet();
}
/********* End *********/
2.复读机的毁灭
/********* Begin *********/
class Repeater
{
//复读机基类的声明
public:
virtual void Play(){
}
virtual ~Repeater(){
cout << "砰!" << "\n";
}
};
//复读机基类的定义
class ForRepeater : public Repeater
{
//正向复读机的声明
public:
virtual void Play(){
cout << "没想到你也是一个复读机" << "\n";
}
virtual ~ForRepeater(){
cout << "正·复读机 炸了" << "\n";
}
};
//正向复读机的定义
class RevRepeater : public Repeater
{
//反向复读机的声明
public:
virtual void Play(){
cout << "机读复个一是也你到想没" << "\n";
}
virtual ~RevRepeater(){
cout << "机读复·反 炸了" << "\n";
}
};
//反向复读机的定义
//普通函数
Repeater* CreateRepeater(int type)
{
//根据type创建指定的复读机
Repeater* p;
if (!type)
p = new ForRepeater();
else
p = new RevRepeater();
return p;
}
/********* End *********/
3.计算图像面积
/********* Begin *********/
class Shape
{
//基类的声明
public:
virtual void PrintArea(){}
};
class Rectangle : public Shape
{
//矩形类的声明
private:
float w, h;
public:
Rectangle(float w, float h)
{
this -> w = w;
this -> h = h;
}
virtual void PrintArea(){
cout << "矩形面积 = " << w*h << "\n";
}
};
//矩形类的定义
class Circle : public Shape
{
//圆形类的声明
private:
float r;
public:
Circle(float r)
{
this -> r = r;
}
virtual void PrintArea(){
cout << "圆形面积 = " << 3.14*r*r << "\n";
}
};
//圆形类的定义
/********* End *********/