小工具知识网

当前位置: 首页 > 行业知识 > 【C++】多态:编程中的“一人千面”艺术

行业知识

【C++】多态:编程中的“一人千面”艺术

2026-11-04 17:31:52 来源:互联网转载

目录

  • 一、多态的概念
  • 二、多态的定义及实现
    • 1.多态的构成条件
    • 2.虚函数的重写
      • 2.1 什么是虚函数?
      • 2.2 虚函数的重写是什么?
      • 2.3 虚函数重写的两个例外
      • 2.4 C++11 override 和 final
      • 2.5 重载、覆盖(重写)、隐藏(重定义)的对比
      • 三、抽象类
        • 3.1 概念
        • 3.2 接口继承和实现继承
        • 多态绝命题(超级坑)
        • 四、多态的原理
          • 4.1虚函数表
          • 4.2多态的原理
            • 4.2.1虚基表和虚表
            • 五、单继承和多继承关系的虚函数表
              • 5.1 单继承中的虚函数表
              • 5.2 多继承中的虚函数表
              • 没有彩蛋有

                前言

                本篇我们来探索一下C++中的多态,欢迎大家和我一起走进多态

                一、多态的概念

                概念:通俗说就是多种形态,不同的对象去完成同一件事情,会产生不同的结果(多种形态)

                例子:就拿买火车票来说,普通人和学生还有军人买票是不一样,普通人买票是全价,学生买票是半价,军人买票是优先买,他们都是人,但是买票的结果不一样,体现了不同的对象干同一件事结果不同

                二、多态的定义及实现

                1.多态的构成条件

                构成多态还有两个条件:

                ① 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写

                ② 必须通过基类的指针或者引用调用虚函数

                2.虚函数的重写

                2.1 什么是虚函数?

                虚函数:即被virtual修饰的类成员函数称为虚函数

                class Person{public://被virtual修饰的函数叫虚函数virtual  void BuyTicke(){cout public:virtual void BuyTicket(){coutpublic://void BuyTicket()virtual void BuyTicket(){coutp.BuyTicket();}int main(){Person p;Student s;func(p);func(s);return 0;}};class B :public A{};class Person{public:virtual  A* BuyTicke(){cout public:virtual B* BuyTicke(){cout public:~Person() { cout public:~Student() { cout Person* p1 = new Person;Person* p2 = new Student;delete p1;delete p2;return 0;}public://destructor()virtual ~Person() { cout public://destructor()virtual ~Student() { cout public:virtual void Drive() final {}};class Benz :public Car{public:virtual void Drive() { cout public:virtual void Drive() {}};class Benz :public Car {public: virtual void Drive() override { cout public:virtual void Drive() = 0;//纯虚函数};public:virtual void func(int val = 1) { std::cout  func(); }};class B : public A{public:void func(int val = 0) { std::cout B* p = new B;p-test();return 0;}//A: A-0 B: B-1 C: A-1 D: B-0 E: 编译出错 F: 以上都不正确public:virtual void Func1(){cout coutpublic:virtual void BuyTicket() { cout public:virtual void BuyTicket() { cout p.BuyTicket();}int main(){Person Mike;Func(Mike);Student Johnson;Func(Johnson);return 0;}public:virtual void BuyTicket() { cout public:virtual void BuyTicket() { cout int i = 0;static int j = 1;int* p1 = new int;const char* p2 = "xxxxxxxx";printf("栈:%p\n", &i);printf("静态区:%p\n", &j);printf("堆:%p\n", p1);printf("常量区:%p\n", p2);Person p;Student s;Person* p3 = &p;Student* p4 = &s;printf("Person虚表地址:%p\n", *(int*)&p);printf("Student虚表地址:%p\n", *(int*)&s);return 0;}public:virtual void Func1(){ cout  cout  cout public:virtual void Func1(){ cout  cout for (size_t i = 0; i 

上一篇:VB计算器源码深度解析,可视化编程实现计算功能探索

下一篇:云服务器登录视频怎么下载?