补全以下程序,实现基类Point和子类Square,Circle等的多态关系
#include<iostream>
using namespace std;
//C++的多态与虚函数
//基类Point
class Point {
public:
Point(int xa, int yb) { //有参构造函数
x = xa;
y = yb;
}
Point(){
x = 0;
y = 0;
}
//定义虚函数display(),满足子类继承时的多态效应。
//补全代码
//----------------------------------------------------
//由于在Point基类阶段,无法实现实际的求面积方法,因此将get_area()设计为纯虚函数。
//请补全代码
//------------------------------------------------
//析构函数通常定义为虚函数
//请补全析构函数头
//--------------------------------
{
cout << "Point destructor" << endl;
}
protected:
int x; //x坐标
int y; //y坐标
};
//Square继承了Point
class Square : public Point{
public:
Square(int xa, int xb, int len):Point(xa,xb),length(len){
}
Square()
{
length = 1;
}
void display(){
//显示一个方形
cout<<"调用Square的display函数,显示一个正方形.\n"<< "坐标:(" << x << ", " << y << "), 边长:" << length <<endl;
}
//补全代码,实现自己的求面积函数get_area
//--------------------------------------
//析构函数通常定义为虚函数
//请补全析构函数头
//--------------------------------------
{
cout << "Square destructor" << endl;
}
protected:
int length;
};
//Circle继承了Point
class Circle: public Point {
public:
Circle(int xa, int xb, int r):Point(xa,xb) {
radius = r;
}
Circle(){
radius = 1;
}
void display() { //显示一个圆
cout<<"调用Circle的display函数,显示一个圆.\n"<< "坐标:(" << x << ", " << y << "), 半径:" << radius <<endl;
}
//补全代码,实现自己的求面积函数get_area
//------------------------------------------
//析构函数通常定义为虚函数
//请补全析构函数头
//-----------------------------------------------
{
cout << "Circle destructor" << endl;
}
protected:
int radius;
};
//编写一个Triangle类,继承Point,属性包含底边长和高
//并有自己的有参,无参构造函数,display函数和get_area函数,以及析构函数
//此处补全代码:
//---------------------------------------------------------------
//显示一个图形的通用函数Disp
void Disp(/*补全代码,填上参数,仔细思考这里应该填写什么类型的 对象?引用?指针?*/)
{
p.display();
}
//显示一个图形面积的通用函数:Area_of_shape
void Area_of_shape(/*补全代码,填上参数,仔细思考这里应该填写什么类型的 对象?引用?指针?*/)
{
cout << s->get_area() << endl;
}
//函数create_shapes实现在堆内存中,动态生成一组图形,并返回首地址。
//option表示图形类型,1为方形,2为圆形,3为三角形
//num为生成图形的数量
Point* create_shapes(int option, int num)
{
//补全代码,实现功能
//建议使用switch,并注意new对象数组的用法。
//--------------------------------------------
}
int main() {
//在堆内存中生成不同的图形。
//定义基类图形指针
Point *p;
int num;//个数
//输入即将生成的方形个数
cin >> num;
//生成一组方形
p = create_shapes(1, num);
//依次显示这组方形的基本信息,以及面积。
for(int i = 0; i < num; i++)
{
//注意:p作为基类指针,在指向子类数组时,
//其对于属性的作用范围仍局限在子类中的基类属性。
//若直接通过+i或[i]形式,会造成内存指向的错位。
//因此,需要想办法将其强制转换为子类类型的指针。
//下同
//显示基本信息
Disp(/*补全代码,填写实参*/);
//显示面积值
Area_of_shape(/*补全代码,填写实参*/);
}
//注销
//注意,由于涉及到数组的注销,因此注销时,基类指针,也需要转换为子类指针才能顺利注销,下同。
//请补齐注销代码
//--------------------------------
//输入即将生成的圆形个数
cin >> num;
//生成一组圆形
p = create_shapes(2, num);
//依次显示这组圆形的基本信息,以及面积。
for(int i = 0; i < num; i++)
{
Disp(/*补全代码,填写实参*/);
Area_of_shape(/*补全代码,填写实参*/);
}
//注销
//请补齐注销代码
//--------------------------------
//输入即将生成的三角形个数
cin >> num;
//生成一组三角形
p = create_shapes(3, num);
//依次显示这组三角形的基本信息,以及面积。
for(int i = 0; i < num; i++)
{
Disp(/*补全代码,填写实参*/);
Area_of_shape(/*补全代码,填写实参*/);
}
//注销
//请补齐注销代码
//----------------------------------------------------
return 0;
}
测试输入:4 91 51 2 32
预期输出:
平均值:44.0
最大值:91
测试输入:
1
2
2
预期输出:
调用Square的display函数,显示一个正方形.
坐标:(0, 0), 边长:1
1
Square destructor
Point destructor
调用Circle的display函数,显示一个圆.
坐标:(0, 0), 半径:1
3.14
调用Circle的display函数,显示一个圆.
坐标:(0, 0), 半径:1
3.14
Circle destructor
Point destructor
Circle destructor
Point destructor
调用Triangle的display函数,显示一个三角形.
坐标:(0, 0), 底边长:1, 高:1
0.5
调用Triangle的display函数,显示一个三角形.
坐标:(0, 0), 底边长:1, 高:1
0.5
Triangle destructor
Point destructor
Triangle destructor
Point destructor
运行结果:
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
//C++的多态与虚函数
//基类Point
class Point {
public:
Point(int xa, int yb) { //有参构造函数
x = xa;
y = yb;
}
Point() {
x = 0;
y = 0;
}
//定义虚函数display(),满足子类继承时的多态效应。
//补全代码
virtual void display() {
cout << "(" << x << "," << y << ")";
}
//----------------------------------------------------
//由于在Point基类阶段,无法实现实际的求面积方法,因此将get_area()设计为纯虚函数。
//请补全代码
virtual double get_area() = 0;
//------------------------------------------------
//析构函数通常定义为虚函数
//请补全析构函数头
virtual ~Point()
//--------------------------------
{
cout << "Point destructor" << endl;
}
protected:
int x; //x坐标
int y; //y坐标
};
//Square继承了Point
class Square : public Point {
public:
Square(int xa, int xb, int len) :Point(xa, xb), length(len) {
}
Square()
{
length = 1;
}
void display() {
//显示一个方形
cout << "调用Square的display函数,显示一个正方形.\n" << "坐标:(" << x << ", " << y << "), 边长:" << length << endl;
}
//补全代码,实现自己的求面积函数get_area
double get_area()
{
return length * length;
}
//--------------------------------------
//析构函数通常定义为虚函数
//请补全析构函数头
~Square()
//--------------------------------------
{
cout << "Square destructor" << endl;
}
protected:
int length;
};
//Circle继承了Point
class Circle : public Point {
public:
Circle(int xa, int xb, int r) :Point(xa, xb) {
radius = r;
}
Circle() {
radius = 1;
}
void display() { //显示一个圆
cout << "调用Circle的display函数,显示一个圆.\n" << "坐标:(" << x << ", " << y << "), 半径:" << radius << endl;
}
//补全代码,实现自己的求面积函数get_area
double get_area()
{
return 3.14 * radius * radius;
}
//------------------------------------------
//析构函数通常定义为虚函数
//请补全析构函数头
~Circle()
//-----------------------------------------------
{
cout << "Circle destructor" << endl;
}
protected:
int radius;
};
//编写一个Triangle类,继承Point,属性包含底边长和高
//并有自己的有参,无参构造函数,display函数和get_area函数,以及析构函数
//此处补全代码:
class Triangle : public Point {
public:
Triangle(int xa, int xb, int len, int hei) :Point(xa, xb) {
length = len;
height = hei;
}
Triangle() {
length = 1;
height = 1;
}
void display() { //显示一个三角形
cout << "调用Triangle的display函数,显示一个三角形.\n" << "坐标:(" << x << ", " << y << "), 底边长:" << length <<",高:"<<height << endl;
}
//补全代码,实现自己的求面积函数get_area
double get_area() {
return 0.5 * length * height;
}
~Triangle(){
cout << "Triangle destructor" << endl;
}
protected:
int length,height; //底边长和高
};
//---------------------------------------------------------------
//显示一个图形的通用函数Disp
void Disp( Point &p /*补全代码,填上参数,仔细思考这里应该填写什么类型的 对象?引用?指针?*/)
{
p.display();
}
//显示一个图形面积的通用函数:Area_of_shape
void Area_of_shape(Point* s /*补全代码,填上参数,仔细思考这里应该填写什么类型的 对象?引用?指针?*/)
{
cout << s->get_area() << endl;
}
//函数create_shapes实现在堆内存中,动态生成一组图形,并返回首地址。
//option表示图形类型,1为方形,2为圆形,3为三角形
//num为生成图形的数量
Point* create_shapes(int option, int num)
{
//补全代码,实现功能
//建议使用switch,并注意new对象数组的用法。
Point* arr = 0;
int i = 0;
//--------------------------------------------
switch (option)
{
case 1:
arr = (Point*)(new Square[num]);
break;
case 2:
arr = (Point*)(new Circle[num]);
break;
case 3:
arr = (Point*)(new Triangle[num]);
break;
default:
break;
}
return arr;
}
int main() {
//在堆内存中生成不同的图形。
//定义基类图形指针
Point* p;
int num;//个数
//输入即将生成的方形个数
cin >> num;
//生成一组方形
p = create_shapes(1, num);
//依次显示这组方形的基本信息,以及面积。
for (int i = 0; i < num; i++)
{
//注意:p作为基类指针,在指向子类数组时,
//其对于属性的作用范围仍局限在子类中的基类属性。
//若直接通过+i或[i]形式,会造成内存指向的错位。
//因此,需要想办法将其强制转换为子类类型的指针。
//下同
//显示基本信息
Disp(((Square*)p)[i] /*补全代码,填写实参*/);
//显示面积值
Area_of_shape( &((Square*)p)[i]/*补全代码,填写实参*/);
}
//注销
//注意,由于涉及到数组的注销,因此注销时,基类指针,也需要转换为子类指针才能顺利注销,下同。
//请补齐注销代码
delete[] (Square*)p;
p = 0;
//--------------------------------
//输入即将生成的圆形个数
cin >> num;
//生成一组圆形
p = create_shapes(2, num);
//依次显示这组圆形的基本信息,以及面积。
for (int i = 0; i < num; i++)
{
Disp(((Circle*)p)[i]/*补全代码,填写实参*/);
Area_of_shape(&((Circle*)p)[i] /*补全代码,填写实参*/);
}
//注销
//请补齐注销代码
delete[](Circle*)p;
p = 0;
//--------------------------------
//输入即将生成的三角形个数
cin >> num;
//生成一组三角形
p = create_shapes(3, num);
//依次显示这组三角形的基本信息,以及面积。
for (int i = 0; i < num; i++)
{
Disp(((Triangle*)p)[i]/*补全代码,填写实参*/);
Area_of_shape(&((Triangle*)p)[i]/*补全代码,填写实参*/);
}
//注销
//请补齐注销代码
delete[](Triangle*)p;
p = 0;
//----------------------------------------------------
return 0;
}
你看看这个,如果有用,麻烦点个采纳,谢谢~~
https://ask.csdn.net/questions/7964435?spm=1005.2025.3001.5141
源于ChatGPT 仅供参考
本题涉及到多态和虚函数的使用,需要仔细理解。下面是完整的代码实现:
```c++
#include<iostream>
using namespace std;
//C++的多态与虚函数
//基类Point
class Point {
public:
Point(int xa, int yb) { //有参构造函数
x = xa;
y = yb;
}
Point() {
x = 0;
y = 0;
}
//定义虚函数display(),满足子类继承时的多态效应。
virtual void display() {
cout << "调用Point的display函数,显示一个点.\n" << "坐标:(" << x << ", " << y << ")" << endl;
}
//----------------------------------------------------
//由于在Point基类阶段,无法实现实际的求面积方法,因此将get_area()设计为纯虚函数。
virtual double get_area() = 0;
//------------------------------------------------
//析构函数通常定义为虚函数
virtual ~Point() {
cout << "Point destructor" << endl;
}
protected:
int x; //x坐标
int y; //y坐标
};
//Square继承了Point
class Square : public Point {
public:
Square(int xa, int xb, int len) :Point(xa, xb), length(len) {
}
Square()
{
length = 1;
}
void display() {
//显示一个方形
cout << "调用Square的display函数,显示一个正方形.\n" << "坐标:(" << x << ", " << y << "), 边长:" << length << endl;
}
//实现自己的求面积函数get_area
double get_area() {
return length * length;
}
//--------------------------------------
//析构函数通常定义为虚函数
virtual ~Square() {
cout << "Square destructor" << endl;
}
protected:
int length;
};
//Circle继承了Point
class Circle : public Point {
public:
Circle(int xa, int xb, int r) :Point(xa, xb) {
radius = r;
}
Circle() {
radius = 1;
}
void display() { //显示一个圆
cout << "调用Circle的display函数,显示一个圆.\n" << "坐标:(" << x << ", " << y << "), 半径:" << radius << endl;
}
//实现自己的求面积函数get_area
double get_area() {
return 3.14 * radius * radius;
}
//------------------------------------------
//析构函数通常定义为虚函数
virtual ~Circle() {
cout << "Circle destructor" << endl;
}
protected:
int radius;
};
//编写一个Triangle类,继承Point,属性包含底边长和高
//并有自己的有参,无参构造函数,display函数和get_area函数,以及析构函数
class Triangle : public Point {
public:
Triangle(int xa, int xb, int b, int h) :Point(xa, xb), base(b), height(h) {
}
Triangle()
{
base = 1;
height = 1;
}
void display() {
//显示一个三角形
cout << "调用Triangle的display函数,显示一个三角形.\n" << "坐标:(" << x << ", " << y << "), 底边:" << base << ",高:" << height << endl;
}
//实现自己的求面积函数get_area
double get_area() {
return 0.5 * base * height;
}
//------------------------------------------
//析构函数通常定义为虚函数
virtual ~Triangle() {
cout << "Triangle destructor" << endl;
}
protected:
int base;
int height;
};
//显示一个图形的通用函数Disp
void Disp(Point& p)
{
p.display();
}
//显示一个图形面积的通用函数:Area_of_shape
void Area_of_shape(Point* s)
{
cout << s->get_area() << endl;
}
//函数create_shapes实现在堆内存中,动态生成一
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!