【C++】深入理解C++虚函数与纯虚函数

2024-06-04 7575阅读

文章目录

  • 一、虚函数(Virtual Function)
    • 1.1 定义和作用
    • 1.2 实现原理
    • 1.3 示例代码
    • 1.4 虚函数的重写
      • 定义
      • 规则
      • 注意事项
      • 示例
      • 1.5 基类和派生类的虚函数表
        • **示例理解**
        • 二、纯虚函数(Pure Virtual Function)
          • 2.1 定义和作用
          • 2.2 示例代码
          • 三、总结

            在C++面向对象编程中,多态性是其三大特性之一(封装、继承和多态)。为了实现多态性,C++引入了虚函数(Virtual Function)和纯虚函数(Pure Virtual Function)的概念。本文将深入探讨虚函数和纯虚函数的原理和应用,帮助读者更好地理解它们在C++中的作用。

            一、虚函数(Virtual Function)

            1.1 定义和作用

            虚函数是在基类中使用关键字 virtual 声明的成员函数,它允许派生类对其进行重写(Override),实现运行时多态。当通过基类指针或引用调用虚函数时,实际调用的是对象类型对应的派生类中的函数,这个过程称为动态绑定(Dynamic Binding)或晚绑定(Late Binding)。

            1.2 实现原理

            虚函数的实现原理基于虚函数表(Virtual Table,简称VTable)。每个使用虚函数的类都有一个虚函数表,该表是一个函数指针数组,存储了指向类的虚函数的指针。类的每个实例都包含一个指向其虚函数表的指针(vptr),通过这个指针可以找到并调用正确的虚函数实现。

            当派生类覆盖(重写)基类的虚函数时,派生类的虚函数表中相应位置的函数指针会被更新为指向派生类中的函数。如果派生类没有重写虚函数,则派生类的虚函数表中会保留指向基类虚函数的指针。

            1.3 示例代码

            #include 
            using namespace std;
            class Base {
            public:
                virtual void show() {
                    cout 
            public:
                void show() override {
                    cout 
                Base* b = new Derived();
                b-show(); // 输出:Derived class show
                delete b;
                return 0;
            }
            
            public:
                virtual void print() const {
                    std::cout } // 虚析构函数
            };
            class Derived : public Base {
            public:
                void print() const override { // 使用override确保正确重写
                    std::cout 
                Base* b = new Derived();
                b-print(); // 输出:Derived class print function
                delete b; // 正确调用派生类析构函数
                return 0;
            }
            
            public:
                virtual void func1() { /* 实现 */ }
                virtual void func2() { /* 实现 */ }
            };
            class Derived : public Base {
            public:
                void func1() override { /* 新实现 */ }
                virtual void func3() { /* 新虚函数 */ }
            };
            
            public:
                virtual void draw() = 0; // 纯虚函数
            };
            class Circle : public Shape {
            public:
                void draw() override {
                    cout 
                Shape* shape = new Circle();
                shape-draw(); // 输出:Drawing a circle
                delete shape;
                return 0;
            }
            

    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]