小工具知识网

当前位置: 首页 > 行业知识 > C++ [多态]

行业知识

C++ [多态]

2026-11-05 20:33:09 来源:互联网转载

���文已收录至《C++语言》专栏!

作者:ARMCSKGT


多态

  • 前言
  • 正文
    • 多态的概念
    • 多态的定义
      • 构成多态的条件
      • 关于final和override
      • 关于重载,重写和重定义
      • 抽象类
        • 概念
        • 补充
        • 多态的原理
          • 虚表指针和虚表
          • 关于虚函数的调用
          • 动态绑定和静态绑定
          • 单继承与多继承中的虚表
            • 单继承中的虚表
            • 多继承中的虚表
            • 菱形继承与多态
            • 最后

              前言

              前面我学习完了面向对象三大特性的前两个,本节我们将为大家介绍最后一大特性,那就是多态,也是面向对象中最重要的一点,通过多态可以让一件事在不同对象的执行下表现出不同的状态,所以多态也可以说是多种状态。

              例如我们平时坐公交车,我们普通人刷公交卡或扫二维码支付车费即可,而学生可以刷学生卡,老人可以刷老年卡,退役军人可以刷拥军卡等等,可以看出,在乘坐公交时,对于支付乘车费这个事情上,不同对象支付费用的方式不同,这就是多态!


              正文

              多态的概念


              多态的概念: 通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成同一件事时会产生出不同的状态。

              例如我们上面所说的乘坐公交车支付费用,对于支付费用这一行为,不同的对象(人)有不同的方法。

              //普通人class Person{public:   virtual void pay() { cout public:   virtual void pay() { cout public:   virtual void pay() { cout public:   virtual void pay() { cout  person.pay(); } //每个人乘车并支付费用int main(){   Person person;         //普通人对象   Student student;       //学生对象   Seniors seniors;       //老人对象   Servicemen servicemen; //军人对象   //依次乘车   Ride(person);   Ride(student);   Ride(seniors);   Ride(servicemen);   return 0;}public:virtual void func(int n = 668) { cout  func(); }};class B : public A{public:virtual void func(int n = 778) { cout public:virtual void func(int n = 888) { cout  func(); }};int main(){B b;C c;b.test();c.test();return 0;}public:virtual void func() { cout cout public:virtual void func() { cout public:virtual void func() { cout  cout B b;C c;b.test();c.test();return 0;}public://增加在函数参数与函数体之间即可virtual void func() final {}}};//在类名和类 {} 之间添加finalpublic://实现函数体的纯虚函数virtual void func1() = 0 { cout  cout  cout };//没有将抽象类中的纯虚函数全部重写 则该子类仍然是抽象类class Child2 : public Base {public:virtual void func1() {}};//虚函数可以选择只继承,只要重写了全部的纯虚函数就不是抽象类class Child3 : public Base{public:virtual void func1() {}virtual void func2() {}};public:virtual void func() { cout cout public:virtual void func1() { cout  cout  cout public:virtual void func1() { cout  cout Base b;Child c;return 0;}for (int i = 0; arr[i]; ++i)printf("[%d]-%p\n", i, arr[i]); //输出每一个虚函数地址cout Base b;Child c;printvft((VF_PTR*)(*(int*)(&b)));printvft((VF_PTR*)(*(int*)(&c)));return 0;}Base obj;int a = 0;//栈区static int b = 0;   //静态区const char* s = "668";    //常量区int* d = new int;   //堆区printf("a 栈区-:%p\n", &a);printf("b 静态区-:%p\n", &b);printf("c 常量区-:%p\n", s);printf("d 堆区-:%p\n", d);printf("\n虚表:\n");printvft(*((VF_PTR**)(&obj)));delete d;return 0;}public:virtual void func() { cout public:virtual void func() { cout b.func();}int main(){Child c;test(c);return 0;} return num1 + num2; }double Add(double num1, double num2) { return num1 + num2; }int main(){Base* ptr = new Child;ptr-func();Add(1, 2);Add(3.14, 6.68);return 0;}public:virtual void func1() { cout  cout public:virtual void func1() { cout  cout public:virtual void func1() { cout  cout Child c;return 0;}for (int i = 0; arr[i]; ++i){printf("%p-", arr[i]);arr[i](); //执行函数}cout Child c;cout Child c;Base1* ptr1 = &c;Base2* ptr2 = &c;ptr1-func1();ptr2-func1();return 0;}public:virtual void func1() { cout public:virtual void func1() { cout  cout public:virtual void func1() { cout  cout public:virtual void func1() { cout  cout Child c;return 0;}

上一篇:python头歌-python第五章作业

下一篇:服务器系统的密码怎么设置?