小工具知识网

当前位置: 首页 > 行业知识 > 【c++】全面理解C++多态:虚函数表深度剖析与实践应用

行业知识

【c++】全面理解C++多态:虚函数表深度剖析与实践应用

2026-10-31 07:02:31 来源:互联网转载

个人主页:Quitecoder

专栏:c++笔记仓

朋友们大家好,通过本篇文章,来详细理解多态的内容

目录

  • `1.多态的定义及实现`
    • `1.1多态的构成条件`
    • `1.2虚函数的重写`
    • `1.3 C++11 override 和 final`
    • `1.4重载、覆盖(重写)、隐藏(重定义)的对比`
    • `2.多态的原理`
      • `2.1虚函数表`
      • `2.2多态的原理`
      • `2.3单继承的虚函数表`
      • `3.抽象类`
        • `3.1接口继承与实现继承`
        • `3.2静态多态与动态多态`
        • `3.3例题`
        • `4.多继承中的虚函数表`
          • `4.1菱形继承和菱形虚拟继承`
          • `4.2菱形虚拟继承:`
          • `5.虚表的存储位置`

            1.多态的定义及实现

            多态的基本概念:多态指的是对象可以通过指向它们的基类的引用或指针被操纵,同时还能保持其派生类部分的特性。将派生类对象当作基类对象来对待,这允许不同类的对象响应相同的消息以不同的方式,换句话说,同一个接口,使用不同的实例而执行不同操作

            比如买票,普通人买票时,是全价买票;学生买票时,是半价买票

            class Person {public:virtual void BuyTicket() { cout public:virtual void BuyTicket() { cout p.BuyTicket();}int main(){Person ps;Student st;Func(ps);Func(st);return 0;}p.BuyTicket();}public:virtual void BuyTicket() { cout public:virtual void BuyTicket() { cout public:virtual void BuyTicket() { cout };class B : public A {};class Person {public:virtual A* f() { return new A; }};class Student : public Person {public:virtual B* f() { return new B; }};public:virtual ~Person() { cout public:virtual ~Student() { cout Person* p1 = new Person;Person* p2 = new Student;delete p1;delete p2;return 0;} cout  cout public:virtual void BuyTicket() { cout public:void BuyTicket() { 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()  { cout public:virtual void Drive() {}};class Benz :public Car {public:virtual void Drive() override { cout public:    void func()     void func(int i)    void func(double d) };public:    virtual void func() { /* ... */ }};class Derived : public Base {public:    void func() override { /* ... */ } // 覆盖(重写)基类中的func};public:    void func() { /* ... */ }    void func(int i) { /* ... */ }};class Derived : public Base {public:    void func(double d) { /* ... */ } // 隐藏了基类的func()    // 注意:现在Base的func()和func(int)都被隐藏,只能通过Derived的对象访问新的func(double)};public:virtual void Func1(){cout public:virtual void BuyTicket() { cout public:virtual void BuyTicket() { cout p-BuyTicket();}int main(){Person Mike;Func(&Mike);Student Johnson;Func(&Johnson);return 0;}public:void BuyTicket() { cout public:virtual void func1() { cout  cout public:virtual void func1() { cout  cout  cout Base b;Derive d;return 0;}for (size_t i = 0; i 

上一篇:WordPress链接生成全攻略,轻松创建高质量链接!

下一篇:au舌音怎么调?