• C++ --- Day04 继承


    实现一个图形类(Shape),包含受保护成员属性:周长、面积,

    公共成员函数:特殊成员函数书写

    定义一个圆形类(Circle),继承自图形类,包含私有属性:半径

    公共成员函数:特殊成员函数、以及获取周长、获取面积函数

    定义一个矩形类(Rect),继承自图形类,包含私有属性:长度、宽度

    公共成员函数:特殊成员函数、以及获取周长、获取面积函数

    在主函数中,分别实例化圆形类对象以及矩形类对象,并测试相关的成员函数。

    1. #include
    2. #define PI 3.14
    3. using namespace std;
    4. //实现一个图形类(Shape),包含受保护成员属性:周长、面积,
    5. //公共成员函数:特殊成员函数书写
    6. class Shape
    7. {
    8. public:
    9. Shape():perimeter(0),area(0)
    10. {
    11. }
    12. Shape(double p,double a):perimeter(p),area(a)
    13. {
    14. }
    15. Shape(const Shape &shape)
    16. {
    17. this->perimeter = shape.perimeter;
    18. this->area = shape.area;
    19. }
    20. ~Shape(){}
    21. Shape& operator=(const Shape &shape)
    22. {
    23. this->perimeter = shape.perimeter;
    24. this->area = shape.area;
    25. return *this;
    26. }
    27. protected:
    28. double perimeter;
    29. double area;
    30. };
    31. //定义一个圆形类(Circle),继承自图形类,包含私有属性:半径
    32. //公共成员函数:特殊成员函数、以及获取周长、获取面积函数
    33. class Circle:public Shape
    34. {
    35. public:
    36. Circle(double r):r(r)
    37. {
    38. perimeter = 2 * PI *r;
    39. area = r*r*PI;
    40. }
    41. Circle(Circle *c):Shape(c->perimeter,c->area),r(c->r)
    42. {
    43. }
    44. ~Circle(){}
    45. Circle& operator=(const Circle &c)
    46. {
    47. this->r = c.r;
    48. this->perimeter = c.perimeter;
    49. this->area = c.area;
    50. return *this;
    51. }
    52. double get_perimeter()
    53. {
    54. return perimeter;
    55. }
    56. double get_area()
    57. {
    58. return area;
    59. }
    60. private:
    61. double r;
    62. };
    63. //定义一个矩形类(Rect),继承自图形类,包含私有属性:长度、宽度
    64. //公共成员函数:特殊成员函数、以及获取周长、获取面积函数
    65. class Rect:public Shape
    66. {
    67. public:
    68. Rect(double l,double w):l(l),w(w)
    69. {
    70. perimeter = 2 *(l+w);
    71. area = l*w;
    72. }
    73. Rect(Rect *c):Shape(c->perimeter,c->area),l(c->l),w(c->w)
    74. {
    75. }
    76. ~Rect(){}
    77. Rect& operator=(const Rect &c)
    78. {
    79. this->l = c.l;
    80. this->w = c.w;
    81. this->perimeter = c.perimeter;
    82. this->area = c.area;
    83. return *this;
    84. }
    85. double get_perimeter()
    86. {
    87. return perimeter;
    88. }
    89. double get_area()
    90. {
    91. return area;
    92. }
    93. private:
    94. double l;
    95. double w;
    96. };
    97. int main()
    98. {
    99. //在主函数中,分别实例化圆形类对象以及矩形类对象,
    100. //并测试相关的成员函数。
    101. Circle c1(5);
    102. cout<<"c1的周长:"<get_perimeter()<
    103. cout<<"c1的面积:"<get_area()<
    104. cout<<"圆类c2由c1赋值构造:"<
    105. Circle c2(c1);
    106. cout<<"c2的周长:"<get_perimeter()<
    107. cout<<"c2的面积:"<get_area()<
    108. cout<<"矩形类c3由c1赋值赋值:"<
    109. Circle c3(2);
    110. c3=c1;
    111. cout<<"c3的周长:"<get_perimeter()<
    112. cout<<"c3的面积:"<get_area()<
    113. Rect r1(2,5);
    114. cout<<"r1的周长:"<get_perimeter()<
    115. cout<<"r1的面积:"<get_area()<
    116. cout<<"矩形类c2由c1赋值构造:"<
    117. Rect r2(r1);
    118. cout<<"r2的周长:"<get_perimeter()<
    119. cout<<"r2的面积:"<get_area()<
    120. cout<<"矩形类c3由c1赋值赋值:"<
    121. Rect r3(1,2);
    122. r3=r1;
    123. cout<<"r3的周长:"<get_perimeter()<
    124. cout<<"r3的面积:"<get_area()<
    125. return 0;
    126. }

    笔记:

    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