• C++继承与派生解析(继承、重载/转换运算符、多重继承、多态、虚函数/纯虚函数、抽象类)


    文末附有测试源码 如需自取

    1:继承面向对象编程的三大特性之一 它使得一个类可以从另一个类中派生,减少代码量。

    1. class 类名 : 继承方式 基类名标识符
    2. 实例如下
    3. class rectangle :public figure

    不同的继承方式那么访问基类中变量的权限也不同

    子类与父类的构造函数访问顺序是:先访问父类构造函数,再访问子类构造函数

    2:重载运算符

    重载运算符可以将你想要的运算符重载成你想要的计算方法

    语法如下

    1. operator 类型名();
    2. 实例如下
    3. cbook operator+(cbook b);
    4. return cbook(m_ipage+b.m_ipage);

    此处重载了+运算符,使得两个对象可以像两个整型变量一样相加

    3:转换运算符

    即可以强制转换数据类型  下面将double类型强制转换为int类型

    1. double i=52.052;
    2. int d;
    3. d=int(i);

    4:多重继承

    顾名思义,一个类可以继承多个类,但实际操作容易出问题,不建议用,主流的语言如java就不支持多继承

    语法如下

    class 类名:继承方式 基类名,继承方式 基类名...

    5:多态 多态也是面向对象编程三大特性之一,其特点是同样的消息被不同类型对象接收时可以有不同的实现

    多态主要用虚函数实现 虚函数用virtual关键字来声明 一般在基类中定义虚函数,然后在派生类中具体实现虚函数

    纯虚函数 是指被表明不具体实现的虚成员函数 起到一个接口的作用

    声明如下 virtual 类型 函数名(参数)=0;

    纯虚函数不可以被继承,派生类必须给出基类中纯虚函数的定义

    6:抽象类 包含有纯虚函数的类称为抽象类 抽象类一般只作为基类派生出其他的子类 并且不可以实例化,但是可以使用指向抽象类的指针

    下面是一些测试源码 如需自取

    1. #include<iostream>
    2. using namespace std;
    3. class employee {
    4. public:
    5. int id;
    6. char name[128];
    7. char depart[128];
    8. virtual void outputname() = 0;//纯虚函数 后面有个=0
    9. };
    10. class copreator :public employee {
    11. public:
    12. char password[128];
    13. void outputname() {
    14. cout << "操作员姓名:" << name << endl;
    15. }
    16. copreator() {
    17. strcpy_s(name, "玫瑰少年");
    18. }
    19. };
    20. class systemmananger :public employee {
    21. public:
    22. char passwordp[128];
    23. void outputname()
    24. {
    25. cout << "系统管理员姓名:" << name << endl;
    26. }
    27. systemmananger() {
    28. strcpy_s(name, "张三");
    29. }
    30. };
    31. class figure {
    32. public:
    33. virtual double getarea() = 0;//纯虚函数 不具体实现 其实现留给派生类去做 提供一个接口的作用
    34. //因为图形类面积计算方法不确定 所以定义为纯虚函数
    35. };
    36. const double pi = 3.14;
    37. class circle :public figure {
    38. private:
    39. double radius;
    40. public:
    41. circle(double dr) { radius = dr; }
    42. double getarea() {
    43. return radius * radius * pi;
    44. }
    45. };
    46. class rectangle :public figure {
    47. protected:
    48. double height, width;
    49. public:
    50. rectangle(double dheight, double dwidth) {
    51. height = dheight;
    52. width = dwidth;
    53. }
    54. double getarea() {
    55. return height * width;
    56. }
    57. };
    58. int main() {
    59. figure* fg1;
    60. fg1 = new rectangle(4.3, 5.2);
    61. cout << fg1->getarea() << endl;
    62. delete fg1;
    63. figure* fg2;
    64. fg2 = new circle(4.6);
    65. cout << fg2->getarea() << endl;
    66. delete fg2;
    67. employee* pworker;//定义指针对象
    68. pworker = new copreator();//调用它的构造函数为pworker赋值
    69. pworker->outputname();//调用coperator类的成员函数
    70. delete pworker;//释放且设置为空
    71. pworker = NULL;
    72. pworker = new systemmananger();//调用另一个子类的构造函数为它赋值
    73. pworker->outputname();//调用这个子类的成员函数
    74. delete pworker;//释放且设置为空
    75. pworker = NULL;
    76. return 0;
    77. //同样的语句 pworker->outputname()由于pworker指向的对象不同 所以其行为也不同 这实际上就是多态
    78. }

  • 相关阅读:
    虚拟机命令学习记录
    新版校园跑腿外卖独立版+APP+小程序前端外卖配送平台源码(含搭建教程)
    Gut(IF=31.793)重磅综述|肠道微生物组如何影响宿主健康
    从迷之自信到逻辑自信(简版)
    前端常用网址总结
    个人笔记--python用tanh画圆形,正方形,长方形(epsilon界面宽度)
    自定义Unity组件——AudioManager(音频管理器)
    1600*C. Remove Adjacent(贪心&字符串)
    理解线程池源码 【C++】面试高频考点
    C语言 指针进阶 贰
  • 原文地址:https://blog.csdn.net/jiebaoshayebuhui/article/details/126494552