小工具知识网

当前位置: 首页 > 行业知识 > [C++] 多态(上) -- 抽象类、虚函数、虚函数表

行业知识

[C++] 多态(上) -- 抽象类、虚函数、虚函数表

2026-11-05 18:23:26 来源:互联网转载

文章目录

  • 1、多态的概念
  • 2、多态的定义及实现
    • 2.1 多态的构成条件
    • 2.2 虚函数
    • 2.3 虚函数的重写
    • 2.4 虚函数重写的两个例外
      • 2.4.1 协变(基类与派生类虚函数返回值类型不同)
      • 2.4.2 析构函数的重写(基类与派生类析在这里插入图片描述
        • 2.4.3 选择题测试
        • 2.5 C++11 final 和 override
          • 2.5.1 final
          • 2.5.2 override
          • 2.6 重载、覆盖(重写)、隐藏(重定义)的对比
          • 3、抽象类
            • 3.1 什么是抽象类
            • 3.2 接口继承和实现接口
            • 4、虚���数表

              1、多态的概念

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

              举个栗子:比如买票这个行为:

              当普通人买票时,是全价买票;

              学生买票时,是半价买票;

              军人买票时是优先买票。

              这个例子就是多态,不同身份对应不同的票价。

              2、多态的定义及实现

              2.1 多态的构成条件

              在继承中要构成多态有两个重要条件:

              1. 必须通过 基类的指针或者引用调用虚函数
              2. 派生类必须对基类的虚函数进行重写(重写的要求三同:返回值相同、函数名相同、参数列表相同)

                我们按照多态的条件来写一份多态的代码:

              class Person{public:virtual void BuyTicket(){cout virtual void BuyTicket(){cout p.BuyTicket();    cout cout public:virtual void BuyTicket(){cout public:virtual void BuyTicket(){cout public:// 子类可以重写虚函数时可以不加 virtual,但是不规范,不推荐这样写void BuyTicket(){cout public:virtual Person* BuyTicket(){cout public:virtual Student* BuyTicket(){cout };class B : public A{};class Person{public:virtual A* BuyTicket(){cout public:virtual B* BuyTicket(){cout p-BuyTicket();cout Person p;func(&p);Student s;func(&s);return 0;}public:virtual ~Person() { cout public:virtual ~Student() { cout Person* p = new Person;delete p;Person* s = new Student;delete s;return 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;}public:virtual void Drive() final {}};class Benz :public Car{public:virtual void Drive() { cout public:void Drive() {}};class Benz :public Car {public:virtual void Drive() override { cout public:virtual void Drive() = 0;};int main(){Car c;return 0;}public:virtual void Drive() = 0;};class Benz : public Car{public://virtual void Drive()//{//cout Benz b;return 0;}public:virtual void Drive() = 0;};class Benz : public Car{public:virtual void Drive(){cout Benz b;    b.Drive();return 0;}public:    virtual void Func1()    {    cout     Base b;    cout public:virtual void Func1(){cout cout cout public:virtual void Func1(){cout Base b;Derive d;return 0;}

上一篇:最新应用MISAO下载指南,轻松获取,即刻体验!

下一篇:揭秘手机闪屏真相,原因解析与解决方案全攻略!