【c++】求正方形形、长方形、圆形的周长和面积
【问题描述】用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 = □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 = □shape01->area();shape01->grith();shape01 = &circular;shape01->area();shape01->grith();return 0;
}
【构造与析构顺序】构造时,先调用基类的构造函数,再调用子类的构造函数;析构时相反,先调用子类的析构函数,再调用父类的析构函数
【析构函数写成虚函数】如果 基类的析构函数不写成虚函数,则在函数结束时,只会调用子类的析构函数,不会调用父类的析构函数,在程序运行结束时,编译器会调用父类的析构函数
下面是基类析构函数写成虚函数后的效果,在子类结束时,会自动调用父类的析构函数。这种写法是推荐的!
【隐藏规则】
1、如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏。(此时显示的是基类的值)
2、如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏。(此时显示的是基类的值)
【覆盖】:如果派生类的函数与基类的函数同名,并且参数也相同,基类函数有virtual关键字。此时,基类的函数被覆盖。(此时显示的是派生类的值)
【c++】求正方形形、长方形、圆形的周长和面积相关推荐
- java-求矩形(长方形)的周长和面积案例
求矩形(长方形)的周长和面积案例 package day07;import java.util.Scanner;public class Rectangle {/*** 需求:* 求一长方形的周长和面 ...
- 设计一个程序,求正方形和长方形的周长,具体要求如下: (1) 定义正方形类Square作为基类,包含数据成员边长,以及构造函数、求正方形周长的虚函数、输出函数。 (2) 定义类Square的共有派
设计一个程序,求正方形和长方形的周长,具体要求如下: (1) 定义正方形类Square作为基类,包含数据成员边长,以及构造函数.求正方形周长的虚函数.输出函数. (2) 定义类Square的共有派生类 ...
- C语言实现一个简单的求正方形,长方形,圆形,正方体,长方体,球体 周长,表面积,体积 数据的程序
1.全局定义 及头函数 #include<stdio.h>int S[2]={0}; float pai = 3.14; float a[3]={0}; 2.程序最开始的提示函数 void ...
- php圆的周长_php面向对象编程练习:计算矩形、三角形、圆形的周长和面积
刚刚学完php面向对象的编程,参考着高洛峰老师的php教程学习了这个实例. 效果图片: 以下是实现代码:index.php 图形计算(使用面向对象开发技术) 图形(周长&面积) 计算器 矩形 ...
- 计算正方形长方形圆形的周长面积
初用Visual studio 2022,当你使用传统的"scanf"的时候会出现下面错误: 错误里面有这样一句话:use _CRT_SECURE_NO_WARNINGS 这个时候 ...
- 圆形的周长、面积怎么计算?(方法练习)
Π在java中可以用Math.PI来代替,剩下的就很简单了package com.homework.java;import java.util.Scanner;public class Work3 { ...
- 凹形长方形的周长计算_【原创】奥数解析(二十九)长方形和正方形的周长
四年级奥数解析(二十九)长方形和正方形的周长 <奥赛天天练>第29讲<长方形和正方形的周长>,学习求一些较复杂的周长问题. 一.长方形.正方形周长的基本公式为: 长方形周长=( ...
- php面向过程求圆 三角形 长方形计算,求,圆,三角形,长方形,梯形的面积,周长公式...
这里有很多公式慢慢看吧: 1 每份数×份数=总数 总数÷每份数=份数 总数÷份数=每份数 2 1倍数×倍数=几倍数 几倍数÷1倍数=倍数 几倍数÷倍数=1倍数 3 速度×时间=路程 路程÷速度=时间 ...
- 长方形和圆形都属于几何图形,都有周长和面积,并且它们都有自己的周长和面积计算公式。使用抽象类的知识设计一个程序,可以计算不同图形的面积和周长。
[案例目标] 学会"图形的面积与周长计算程序设计"的实现思路. 独立完成"图形的面积与周长计算程序设计"的源代码编写.编译及运行. 理解和掌握面向对象的设计过程 ...
最新文章
- 20、C#里面方法的创建和显示
- C#实现HttpUtility.UrlEncode输出大写字母
- Spring 集成 AspectJ的原理
- namp - 端口扫描 主机判断 漏洞分析
- 如何使用js判断视频是否可以成功访问
- Dynamic Set Up the Web Reference Url To WebService
- lintcode-微软笔试
- obs 推流编码在哪设置_直播工具OBS推流配置操作指引
- R语言缺失值高级处理方法
- Favoring Curry
- P4556 雨天的尾巴 线段树合并
- android沉浸式状态栏(像iOS一样的状态栏)
- Flutter技术与实战(6)
- pcs 模块 , 信号编码技术
- 程序员坐牢会被安排写代码吗?
- 记一个微商城促销方案实现流程图
- K210学习笔记(五)——MAIX BIT(K210)与STM32串口通讯
- 高德导航显示白屏的问题
- 如何复现论文?什么是论文复现?
- php的redis单例模式
热门文章
- Java深度学习系列——深入学习String
- 如何知道特征的重要性
- MySQL中In与Exists的区别
- 媲美ps的图像编辑器Affinity Photo 1.7.0.128中文版
- Automa函数学习(三)
- python游戏设计_用Python设计一个经典小游戏
- 计算机功能转动怎么设定,“怎么调节电脑风扇转速”的解决方案
- JAVA笔记(五)-小数计算为什么会出错?
- Mechine learning for OpenCV 学习笔记 day3
- 应用宝SDK YSDK登录验证服务端