实现一个图形类(Shape),包含受保护成员属性:周长、面积,
公共成员函数:特殊成员函数书写
定义一个圆形类(Circle),继承自图形类,包含私有属性:半径
公共成员函数:特殊成员函数、以及获取周长、获取面积函数
定义一个矩形类(Rect),继承自图形类,包含私有属性:长度、宽度
公共成员函数:特殊成员函数、以及获取周长、获取面积函数
在主函数中,分别实例化圆形类对象以及矩形类对象,并测试相关的成员函数。
- #include
- #define PI 3.14
- using namespace std;
-
- //实现一个图形类(Shape),包含受保护成员属性:周长、面积,
- //公共成员函数:特殊成员函数书写
- class Shape
- {
- public:
- Shape():perimeter(0),area(0)
- {
-
- }
- Shape(double p,double a):perimeter(p),area(a)
- {
-
- }
- Shape(const Shape &shape)
- {
- this->perimeter = shape.perimeter;
- this->area = shape.area;
- }
- ~Shape(){}
- Shape& operator=(const Shape &shape)
- {
- this->perimeter = shape.perimeter;
- this->area = shape.area;
- return *this;
- }
- protected:
- double perimeter;
- double area;
- };
-
-
- //定义一个圆形类(Circle),继承自图形类,包含私有属性:半径
- //公共成员函数:特殊成员函数、以及获取周长、获取面积函数
- class Circle:public Shape
- {
- public:
- Circle(double r):r(r)
- {
- perimeter = 2 * PI *r;
- area = r*r*PI;
- }
- Circle(Circle *c):Shape(c->perimeter,c->area),r(c->r)
- {
- }
- ~Circle(){}
- Circle& operator=(const Circle &c)
- {
- this->r = c.r;
- this->perimeter = c.perimeter;
- this->area = c.area;
- return *this;
- }
- double get_perimeter()
- {
- return perimeter;
- }
- double get_area()
- {
- return area;
- }
-
- private:
- double r;
-
- };
-
- //定义一个矩形类(Rect),继承自图形类,包含私有属性:长度、宽度
- //公共成员函数:特殊成员函数、以及获取周长、获取面积函数
- class Rect:public Shape
- {
- public:
- Rect(double l,double w):l(l),w(w)
- {
- perimeter = 2 *(l+w);
- area = l*w;
- }
- Rect(Rect *c):Shape(c->perimeter,c->area),l(c->l),w(c->w)
- {
- }
- ~Rect(){}
- Rect& operator=(const Rect &c)
- {
- this->l = c.l;
- this->w = c.w;
- this->perimeter = c.perimeter;
- this->area = c.area;
- return *this;
- }
- double get_perimeter()
- {
- return perimeter;
- }
- double get_area()
- {
- return area;
- }
-
- private:
- double l;
- double w;
-
- };
-
-
- int main()
- {
- //在主函数中,分别实例化圆形类对象以及矩形类对象,
- //并测试相关的成员函数。
- Circle c1(5);
- cout<<"c1的周长:"<
get_perimeter()< - cout<<"c1的面积:"<
get_area()< -
- cout<<"圆类c2由c1赋值构造:"<
- Circle c2(c1);
- cout<<"c2的周长:"<
get_perimeter()< - cout<<"c2的面积:"<
get_area()< -
- cout<<"矩形类c3由c1赋值赋值:"<
- Circle c3(2);
- c3=c1;
- cout<<"c3的周长:"<
get_perimeter()< - cout<<"c3的面积:"<
get_area()< -
- Rect r1(2,5);
- cout<<"r1的周长:"<
get_perimeter()< - cout<<"r1的面积:"<
get_area()< -
- cout<<"矩形类c2由c1赋值构造:"<
- Rect r2(r1);
- cout<<"r2的周长:"<
get_perimeter()< - cout<<"r2的面积:"<
get_area()< -
- cout<<"矩形类c3由c1赋值赋值:"<
- Rect r3(1,2);
- r3=r1;
- cout<<"r3的周长:"<
get_perimeter()< - cout<<"r3的面积:"<
get_area()< -
-
- return 0;
- }
笔记:
4.6 继承
4.6.1 继承的基本语法
普通实现:
class 子类(派生类) :继承方式 父类(基类){}
4.6.2 继承方式
继承方式一共三种:
-
公共继承:基类中的公共权限在派生类中也是公共权限,保护权限还是保护权限,私有权限访问不了
-
保护继承:基类中的公共和保护权限,都成为保护权限,私有权限访问不了
-
私有继承:基类中的公共和保护权限都成为私有权限,私有权限访问不了
4.6.3 继承中的对象模型
问题:从父类继承过来的,那些属于子类对象
父类中所有的非静态的成员属性都会被子类继承下去
基类中的非静态私有成员也会被继承下来,只是访问不到
4.6.4 继承中构造和析构顺序
子类继承父类之后,当创建子类对象,也会调用父类的构造函数
顺序:
构造:先父类构造,再构造子类
析构:先子类析构,再父类析构
4.6.5 继承同名成员处理方式
父类和子类中出现同名成员时应该如何访问
-
访问子类通同名成员 直接访问即可
-
访问父类同名成 需要加父类的作用域
如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中多有同名成员函数(包括重载的)
4.6.6 继承同名静态成员处理方式
静态成员和非静态成员出现同名,处理方式一直
4.6.7 多继承语法
c++允许一个类继承多个类
语法:class 子类 : 继承方式 父类1, 继承方式 父类2......
多继承肯会引发父类中有同名成员出现,需要加作用域区分
C++实际开发中不建议用多继承
4.6.8 菱形继承
概念:
两个派生类继承同一个基类
又有某个类同时继承这两个派生类
这种继承被称为菱形继承,或者钻石继承
产生的问题:
都继承了基类,有二义性
继承了两份基类
虚继承
继承之前加上关键字virtual变为虚继承
虚继承中的基类称为,虚基类
-
相关阅读:
阿里内部Java岗位面试笔记“狂刷29天”成功斩获17个Offer
Python小练习三
Jenkins实现-sonarqbue 代码质量检测CI部署
EMQX 4.x 版本更新:Kafka 与 RocketMQ 集成安全增强
springcloud的gateway使用
uni-admin 利用云数据表自动生成页面
多线程并发环境下,数据的安全问题&&线程池
校园跑腿小程序还受欢迎不?
Jetson Nano 部署(3):TensorRT介绍
C++:拷贝构造函数的初始化列表
-
原文地址:https://blog.csdn.net/weixin_61882921/article/details/132839330