【问题描述】用c++实现求正方形、长方形、圆形的面积和周长,要求使用派生和继承

【编译环境】 ubuntu20.04  g++

【实现思路】使用c++的多态与继承,基类是形状类,重写求周长和面积函数,实现多态。但是要注意到长方形需要两个参数,圆形和正方形一个参数即可。结合虚函数和函数重载实现,代码如下。

#include <iostream>using namespace std;
#define PI 3.14159class Shape
{
public:virtual void area(int w) = 0;  //纯虚函数virtual void grith(int w) = 0; //纯虚函数virtual void grith(int w, int h) =0; //函数重载virtual void area(int w, int h) =0;     //函数重载};
class Rectangle : public Shape //长方形
{
public:void area(int w){};void grith(int w){};void grith(int w, int h) {cout << "长方形状周长为:" << (w + h) * 2 << endl;};void area(int w, int h) {cout << "长方形状面积为:" << w * h << endl;};
};
class Square : public Shape //正方形
{
public:void area(int w,int h){};void grith(int w,int h){};void area(int w){cout << "正方形面积" << w * w << endl;};void grith(int w){cout << "正方形周长" << w * 4 << endl;};
};
class Circular : public Shape //圆形
{
public:void area(int w,int h){};void grith(int w,int h){};void area(int w){cout << "圆形面积:" << w * w * PI << endl;;};void grith(int w){cout << "圆形周长" << w * 2 * PI << endl;};
};int main()
{Shape *shape01;Shape *shape02;Shape *shape03;Rectangle rectangle;Square square;Circular circular;shape01 = &rectangle;shape01->area(3, 4);shape01->grith(3, 4);shape02 = &square;shape02->area(2);shape02->grith(2);shape03 = &circular;shape03->area(2);shape03->grith(2);return 0;
}

输出结果:

【存在的问题】重载了虚函数,纯虚函数需要在每一个子类中实现,若有一个子类忘记实现,则会编译报错,有点复杂。下面是改进后的方法,在调用子类构造函数时,把长宽传进去,基类只有面积和周长这两个接口,在子类中进行了重载。编程传参一般放在初始化即构造函数初始化(个人理解)

#include <iostream>using namespace std;
#define PI 3.14159class Shape
{
public:virtual void area() = 0;  //纯虚函数virtual void grith() = 0; //纯虚函数Shape(){cout << "Shape构造函数" << endl;}virtual ~Shape() { cout << "析构Shape" << endl; }
};
class Rectangle : public Shape //长方形
{
public:Rectangle(int x, int y){cout << "构造函数"<< "Rectangle:长 " << x << " 宽 " << y << endl;w = x;h = y;};~Rectangle() { cout << "析构Rectangle" << endl; }void grith(){cout << "长方形状周长为:" << (w + h) * 2 << endl;};void area(){cout << "长方形状面积为:" << w * h << endl;};private:int w, h;
};
class Square : public Shape //正方形
{
public:Square(int x){cout << "构造函数"<< "Square 宽:" << x << endl;w = x;};~Square() { cout << "析构Square" << endl; }void area(){cout << "正方形面积" << w * w << endl;};void grith(){cout << "正方形周长" << w * 4 << endl;};private:int w;
};
class Circular : public Shape //圆形
{
public:Circular(int x){cout << "构造函数"<< "Circular 半径: " << x << endl;w = x;};~Circular() { cout << "析构Circular" << endl; }void area(){cout << "圆形面积:" << w * w * PI << endl;;};void grith(){cout << "圆形周长" << w * 2 * PI << endl;};private:int w;
};int main()
{Shape *shape01;Rectangle rectangle(3, 4);Square square(4);Circular circular(4);shape01 = &rectangle;shape01->area();shape01->grith();shape01 = &square;shape01->area();shape01->grith();shape01 = &circular;shape01->area();shape01->grith();return 0;
}

【构造与析构顺序】构造时,先调用基类的构造函数,再调用子类的构造函数;析构时相反,先调用子类的析构函数,再调用父类的析构函数

【析构函数写成虚函数】如果 基类的析构函数不写成虚函数,则在函数结束时,只会调用子类的析构函数,不会调用父类的析构函数,在程序运行结束时,编译器会调用父类的析构函数

下面是基类析构函数写成虚函数后的效果,在子类结束时,会自动调用父类的析构函数。这种写法是推荐的!

【隐藏规则】

1、如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏。(此时显示的是基类的值)

2、如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏。(此时显示的是基类的值)

【覆盖】:如果派生类的函数与基类的函数同名,并且参数也相同,基类函数有virtual关键字。此时,基类的函数被覆盖。(此时显示的是派生类的值)

【c++】求正方形形、长方形、圆形的周长和面积相关推荐

  1. java-求矩形(长方形)的周长和面积案例

    求矩形(长方形)的周长和面积案例 package day07;import java.util.Scanner;public class Rectangle {/*** 需求:* 求一长方形的周长和面 ...

  2. 设计一个程序,求正方形和长方形的周长,具体要求如下: (1) 定义正方形类Square作为基类,包含数据成员边长,以及构造函数、求正方形周长的虚函数、输出函数。 (2) 定义类Square的共有派

    设计一个程序,求正方形和长方形的周长,具体要求如下: (1) 定义正方形类Square作为基类,包含数据成员边长,以及构造函数.求正方形周长的虚函数.输出函数. (2) 定义类Square的共有派生类 ...

  3. C语言实现一个简单的求正方形,长方形,圆形,正方体,长方体,球体 周长,表面积,体积 数据的程序

    1.全局定义 及头函数 #include<stdio.h>int S[2]={0}; float pai = 3.14; float a[3]={0}; 2.程序最开始的提示函数 void ...

  4. php圆的周长_php面向对象编程练习:计算矩形、三角形、圆形的周长和面积

    刚刚学完php面向对象的编程,参考着高洛峰老师的php教程学习了这个实例. 效果图片: 以下是实现代码:index.php 图形计算(使用面向对象开发技术) 图形(周长&面积) 计算器 矩形 ...

  5. 计算正方形长方形圆形的周长面积

    初用Visual studio 2022,当你使用传统的"scanf"的时候会出现下面错误: 错误里面有这样一句话:use _CRT_SECURE_NO_WARNINGS 这个时候 ...

  6. 圆形的周长、面积怎么计算?(方法练习)

    Π在java中可以用Math.PI来代替,剩下的就很简单了package com.homework.java;import java.util.Scanner;public class Work3 { ...

  7. 凹形长方形的周长计算_【原创】奥数解析(二十九)长方形和正方形的周长

    四年级奥数解析(二十九)长方形和正方形的周长 <奥赛天天练>第29讲<长方形和正方形的周长>,学习求一些较复杂的周长问题. 一.长方形.正方形周长的基本公式为: 长方形周长=( ...

  8. php面向过程求圆 三角形 长方形计算,求,圆,三角形,长方形,梯形的面积,周长公式...

    这里有很多公式慢慢看吧: 1 每份数×份数=总数 总数÷每份数=份数 总数÷份数=每份数 2 1倍数×倍数=几倍数 几倍数÷1倍数=倍数 几倍数÷倍数=1倍数 3 速度×时间=路程 路程÷速度=时间 ...

  9. 长方形和圆形都属于几何图形,都有周长和面积,并且它们都有自己的周长和面积计算公式。使用抽象类的知识设计一个程序,可以计算不同图形的面积和周长。

    [案例目标] 学会"图形的面积与周长计算程序设计"的实现思路. 独立完成"图形的面积与周长计算程序设计"的源代码编写.编译及运行. 理解和掌握面向对象的设计过程 ...

最新文章

  1. 20、C#里面方法的创建和显示
  2. C#实现HttpUtility.UrlEncode输出大写字母
  3. Spring 集成 AspectJ的原理
  4. namp - 端口扫描 主机判断 漏洞分析
  5. 如何使用js判断视频是否可以成功访问
  6. Dynamic Set Up the Web Reference Url To WebService
  7. lintcode-微软笔试
  8. obs 推流编码在哪设置_直播工具OBS推流配置操作指引
  9. R语言缺失值高级处理方法
  10. Favoring Curry
  11. P4556 雨天的尾巴 线段树合并
  12. android沉浸式状态栏(像iOS一样的状态栏)
  13. Flutter技术与实战(6)
  14. pcs 模块 , 信号编码技术
  15. 程序员坐牢会被安排写代码吗?
  16. 记一个微商城促销方案实现流程图
  17. K210学习笔记(五)——MAIX BIT(K210)与STM32串口通讯
  18. 高德导航显示白屏的问题
  19. 如何复现论文?什么是论文复现?
  20. php的redis单例模式

热门文章

  1. Java深度学习系列——深入学习String
  2. 如何知道特征的重要性
  3. MySQL中In与Exists的区别
  4. 媲美ps的图像编辑器Affinity Photo 1.7.0.128中文版
  5. Automa函数学习(三)
  6. python游戏设计_用Python设计一个经典小游戏
  7. 计算机功能转动怎么设定,“怎么调节电脑风扇转速”的解决方案
  8. JAVA笔记(五)-小数计算为什么会出错?
  9. Mechine learning for OpenCV 学习笔记 day3
  10. 应用宝SDK YSDK登录验证服务端