《C++进阶--10.多态》

C++进阶:详解多态(多态、虚函数、抽象类以及虚函数原理详解) 摘要: 多态是面向对象编程中令人着迷的概念,通过虚函数实现不同对象对同一消息的不同响应。C++11的`override`和`final`关键字增强了虚函数的重写机制。重载、覆盖和隐藏让代码更具灵活性和可扩展性。 抽象类为定义接口和规范派生类行为提供了有力工具。虚函数的原理涉及虚函数表,实现动态绑定,让程序更具扩展性。单继承和多继承中的虚函数表展现了面向对象编程的精妙之处。 阅读详情

目录

10. 多态

10.1 多态的基本概念

10.2 多态案例一-计算器类

10.3 纯虚函数和抽象类

10.4 多态案例二-制作饮品

10.5 虚析构和纯虚析构

10.6 多态案例三-电脑组装


10. 多态

10.1 多态的基本概念

多态是C++面向对象三大特性之一

多态分为两类

  • 静态多态: 函数重载 和 运算符重载属于静态多态,复用函数名

  • 动态多态: 派生类和虚函数实现运行时多态

静态多态和动态多态区别:

  • 静态多态的函数地址早绑定 - 编译阶段确定函数地址

  • 动态多态的函数地址晚绑定 - 运行阶段确定函数地址

示例:

class Animal
{
public:
    //Speak函数就是虚函数
    //函数前面加上virtual关键字,变成虚函数,那么编译器在编译的时候就不能确定函数调用了。
    virtual void speak()
    {
        cout << "动物在说话" << endl;
    }
};
​
class Cat :public Animal
{
public:
    void speak()
    {
        cout << "小猫在说话" << endl;
    }
};
​
class Dog :public Animal
{
public:
​
    void speak()
    {
        cout << "小狗在说话" << endl;
    }
​
};
//我们希望传入什么对象,那么就调用什么对象的函数
//如果函数地址在编译阶段就能确定,那么静态联编
//如果函数地址在运行阶段才能确定,就是动态联编
​
void DoSpeak(Animal & animal)
{
    animal.speak();
}
//
//多态满足条件: 
//1、有继承关系
//2、子类重写父类中的虚函数
//多态使用:
//父类指针或引用指向子类对象
​
void test01()
{
    Cat cat;
    DoSpeak(cat);
​
​
    Dog dog;
    DoSpeak(dog);
}
​
​
int main() {
​
    test01();
​
    system("pause");
​
    return 0;
}

总结:

多态满足条件

  • 有继承关系

  • 子类重写父类中的虚函数

多态使用条件

  • 父类指针或引用指向子类对象

重写:函数返回值类型 函数名 参数列表 完全一致称为重写

10.2 多态案例一-计算器类

案例描述:

分别利用普通写法和多态技术,设计实现两个操作数进行运算的计算器类

多态的优点:

  • 代码组织结构清晰

  • 可读性强

  • 利于前期和后期的扩展以及维护

示例:

//普通实现
class Calculator {
public:
    int getResult(string oper)
    {
        if (oper == "+") {
            return m_Num1 + m_Num2;
        }
        else if (oper == "-") {
            return m_Num1 - m_Num2;
        }
        else if (oper == "*") {
            return m_Num1 * m_Num2;
        }
        //如果要提供新的运算,需要修改源码
    }
public:
    int m_Num1;
    int m_Num2;
};
​
void test01()
{
    //普通实现测试
    Calculator c;
    c.m_Num1 = 10;
    c.m_Num2 = 10;
    cout << c.m_Num1 << " + " << c.m_Num2 << " = " << c.getResult("+") << endl;
​
    cout << c.m_Num1 << " - " << c.m_Num2 << " = " << c.getResult("-") << endl;
​
    cout << c.m_Num1 << " * " << c.m_Num2 << " = " << c.getResult("*") << endl;
}
​
​
​
//多态实现
//抽象计算器类
//多态优点:代码组织结构清晰,可读性强,利于前期和后期的扩展以及维护
class AbstractCalculator
{
public :
​
    virtual int getResult()
    {
        return 0;
    }
​
    int m_Num1;
    int m_Num2;
};
​
//加法计算器
class AddCalculator :public AbstractCalculator
{
public:
    int getResult()
    {
        return m_Num1 + m_Num2;
    }
};
​
//减法计算器
class SubCalculator :public AbstractCalculator
{
public:
    int getResult()
    {
        return m_Num1 - m_Num2;
    }
};
​
//乘法计算器
class MulCalculator :public AbstractCalculator
{
public:
    int getResult()
    {
        return m_Num1 * m_Num2;
    }
};
​
​
void test02()
{
    //创建加法计算器
    AbstractCalculator *abc = new AddCalculator;
    abc->m_Num1 = 10;
    abc->m_Num2 = 10;
    cout << abc->m_Num1 << " + " << abc->m_Num2 << " = " << abc->getResult() << endl;
    delete abc;  //用完了记得销毁
​
    //创建减法计算器
    abc = new SubCalculator;
    abc->m_Num1 = 10;
    abc->m_Num2 = 10;
    cout << abc->m_Num1 << " - " << abc->m_Num2 << " = " << abc->getResult() << endl;
    delete abc;  
​
    //创建乘法计算器
    abc = new MulCalculator;
    abc->m_Num1 = 10;
    abc->m_Num2 = 10;
    cout << abc->m_Num1 << " * " << abc->m_Num2 << " = " << abc->getResult() << endl;
    delete abc;
}
​
int main() {
​
    //test01();
​
    test02();
​
    system("pause");
​
    return 0;
}

总结:C++开发提倡利用多态设计程序架构,因为多态优点很多

10.3 纯虚函数和抽象类

在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容

因此可以将虚函数改为纯虚函数

纯虚函数语法:virtual 返回值类型 函数名 (参数列表)= 0 ;

当类中有了纯虚函数,这个类也称为抽象类

抽象类特点:

  • 无法实例化对象

  • 子类必须重写抽象类中的纯虚函数,否则也属于抽象类

示例:

class Base
{
public:
    //纯虚函数
    //类中只要有一个纯虚函数就称为抽象类
    //抽象类无法实例化对象
    //子类必须重写父类中的纯虚函数,否则也属于抽象类
    virtual void func() = 0;
};
​
class Son :public Base
{
public:
    virtual void func() 
    {
        cout << "func调用" << endl;
    };
};
​
void test01()
{
    Base * base = NULL;
    //base = new Base; // 错误,抽象类无法实例化对象
    base = new Son;
    base->func();
    delete base;//记得销毁
}
​
int main() {
​
    test01();
​
    system("pause");
​
    return 0;
}

10.4 多态案例二-制作饮品

案例描述:

制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料

利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶

示例:

//抽象制作饮品
class AbstractDrinking {
public:
    //烧水
    virtual void Boil() = 0;
    //冲泡
    virtual void Brew() = 0;
    //倒入杯中
    virtual void PourInCup() = 0;
    //加入辅料
    virtual void PutSomething() = 0;
    //规定流程
    void MakeDrink() {
        Boil();
        Brew();
        PourInCup();
        PutSomething();
    }
};
​
//制作咖啡
class Coffee : public AbstractDrinking {
public:
    //烧水
    virtual void Boil() {
        cout << "煮农夫山泉!" << endl;
    }
    //冲泡
    virtual void Brew() {
        cout << "冲泡咖啡!" << endl;
    }
    //倒入杯中
    virtual void PourInCup() {
        cout << "将咖啡倒入杯中!" << endl;
    }
    //加入辅料
    virtual void PutSomething() {
        cout << "加入牛奶!" << endl;
    }
};
​
//制作茶水
class Tea : public AbstractDrinking {
public:
    //烧水
    virtual void Boil() {
        cout << "煮自来水!" << endl;
    }
    //冲泡
    virtual void Brew() {
        cout << "冲泡茶叶!" << endl;
    }
    //倒入杯中
    virtual void PourInCup() {
        cout << "将茶水倒入杯中!" << endl;
    }
    //加入辅料
    virtual void PutSomething() {
        cout << "加入枸杞!" << endl;
    }
};
​
//业务函数
void DoWork(AbstractDrinking* drink) {
    drink->MakeDrink();
    delete drink;
}
​
void test01() {
    DoWork(new Coffee);
    cout << "--------------" << endl;
    DoWork(new Tea);
}
​
​
int main() {
​
    test01();
​
    system("pause");
​
    return 0;
}

10.5 虚析构和纯虚析构

多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码

解决方式:将父类中的析构函数改为虚析构或者纯虚析构

虚析构和纯虚析构共性:

  • 可以解决父类指针释放子类对象

  • 都需要有具体的函数实现

虚析构和纯虚析构区别:

  • 如果是纯虚析构,该类属于抽象类,无法实例化对象

虚析构语法:

virtual ~类名(){}

纯虚析构语法:

virtual ~类名() = 0;

类名::~类名(){}

示例:

class Animal {
public:
​
    Animal()
    {
        cout << "Animal 构造函数调用!" << endl;
    }
    virtual void Speak() = 0;
​
    //析构函数加上virtual关键字,变成虚析构函数
    //virtual ~Animal()
    //{
    //  cout << "Animal虚析构函数调用!" << endl;
    //}
​
​
    virtual ~Animal() = 0;
};
​
Animal::~Animal()
{
    cout << "Animal 纯虚析构函数调用!" << endl;
}
​
//和包含普通纯虚函数的类一样,包含了纯虚析构函数的类也是一个抽象类。不能够被实例化。
​
class Cat : public Animal {
public:
    Cat(string name)
    {
        cout << "Cat构造函数调用!" << endl;
        m_Name = new string(name);
    }
    virtual void Speak()
    {
        cout << *m_Name <<  "小猫在说话!" << endl;
    }
    ~Cat()
    {
        cout << "Cat析构函数调用!" << endl;
        if (this->m_Name != NULL) {
            delete m_Name;
            m_Name = NULL;
        }
    }
​
public:
    string *m_Name;
};
​
void test01()
{
    Animal *animal = new Cat("Tom");
    animal->Speak();
​
    //通过父类指针去释放,会导致子类对象可能清理不干净,造成内存泄漏
    //怎么解决?给基类增加一个虚析构函数
    //虚析构函数就是用来解决通过父类指针释放子类对象
    delete animal;
}
​
int main() {
​
    test01();
​
    system("pause");
​
    return 0;
}

总结:

1. 虚析构或纯虚析构就是用来解决通过父类指针释放子类对象

2. 如果子类中没有堆区数据,可以不写为虚析构或纯虚析构

3. 拥有纯虚析构函数的类也属于抽象类

10.6 多态案例三-电脑组装

案例描述:

电脑主要组成部件为 CPU(用于计算),显卡(用于显示),内存条(用于存储)

将每个零件封装出抽象基类,并且提供不同的厂商生产不同的零件,例如Intel厂商和Lenovo厂商

创建电脑类提供让电脑工作的函数,并且调用每个零件工作的接口

测试时组装三台不同的电脑进行工作

示例:

#include<iostream>
using namespace std;
​
//抽象CPU类
class CPU
{
public:
    //抽象的计算函数
    virtual void calculate() = 0;
};
​
//抽象显卡类
class VideoCard
{
public:
    //抽象的显示函数
    virtual void display() = 0;
};
​
//抽象内存条类
class Memory
{
public:
    //抽象的存储函数
    virtual void storage() = 0;
};
​
//电脑类
class Computer
{
public:
    Computer(CPU * cpu, VideoCard * vc, Memory * mem)
    {
        m_cpu = cpu;
        m_vc = vc;
        m_mem = mem;
    }
​
    //提供工作的函数
    void work()
    {
        //让零件工作起来,调用接口
        m_cpu->calculate();
​
        m_vc->display();
​
        m_mem->storage();
    }
​
    //提供析构函数 释放3个电脑零件
    ~Computer()
    {
​
        //释放CPU零件
        if (m_cpu != NULL)
        {
            delete m_cpu;
            m_cpu = NULL;
        }
​
        //释放显卡零件
        if (m_vc != NULL)
        {
            delete m_vc;
            m_vc = NULL;
        }
​
        //释放内存条零件
        if (m_mem != NULL)
        {
            delete m_mem;
            m_mem = NULL;
        }
    }
​
private:
​
    CPU * m_cpu; //CPU的零件指针
    VideoCard * m_vc; //显卡零件指针
    Memory * m_mem; //内存条零件指针
};
​
//具体厂商
//Intel厂商
class IntelCPU :public CPU
{
public:
    virtual void calculate()
    {
        cout << "Intel的CPU开始计算了!" << endl;
    }
};
​
class IntelVideoCard :public VideoCard
{
public:
    virtual void display()
    {
        cout << "Intel的显卡开始显示了!" << endl;
    }
};
​
class IntelMemory :public Memory
{
public:
    virtual void storage()
    {
        cout << "Intel的内存条开始存储了!" << endl;
    }
};
​
//Lenovo厂商
class LenovoCPU :public CPU
{
public:
    virtual void calculate()
    {
        cout << "Lenovo的CPU开始计算了!" << endl;
    }
};
​
class LenovoVideoCard :public VideoCard
{
public:
    virtual void display()
    {
        cout << "Lenovo的显卡开始显示了!" << endl;
    }
};
​
class LenovoMemory :public Memory
{
public:
    virtual void storage()
    {
        cout << "Lenovo的内存条开始存储了!" << endl;
    }
};
​
​
void test01()
{
    //第一台电脑零件
    CPU * intelCpu = new IntelCPU;
    VideoCard * intelCard = new IntelVideoCard;
    Memory * intelMem = new IntelMemory;
​
    cout << "第一台电脑开始工作:" << endl;
    //创建第一台电脑
    Computer * computer1 = new Computer(intelCpu, intelCard, intelMem);
    computer1->work();
    delete computer1;
​
    cout << "-----------------------" << endl;
    cout << "第二台电脑开始工作:" << endl;
    //第二台电脑组装
    Computer * computer2 = new Computer(new LenovoCPU, new LenovoVideoCard, new LenovoMemory);;
    computer2->work();
    delete computer2;
​
    cout << "-----------------------" << endl;
    cout << "第三台电脑开始工作:" << endl;
    //第三台电脑组装
    Computer * computer3 = new Computer(new LenovoCPU, new IntelVideoCard, new LenovoMemory);;
    computer3->work();
    delete computer3;
​
}

面试复习题--RN面试 考察点:热更新方案的深度理解,选型能力,实战落地经验。答题思路主流热更新方案对比。 阅读详情

相关推荐

光模块封装工艺简介

光模块按照部件可以分为芯片、光器件、光模块三个层级;按照应用领域大概可分为电信应用、数通应用两个领域;按照内部器件的封装工艺可分为TO、Box、COB三大类。 但是,无论是哪种类型的光模块,其生产工艺基本上可以分为封装、测试两大块。   那什么叫做器件封装呢?我的理解器件封装就是利用胶水、焊料、机械、热量等手段把器件按照一定的先后次序结合形成一个整体的过程,就好像早上吃的煎饼,把面粉、鸡蛋、脆饼、烤肠、葱花等这些“器件”,按照一定的顺序,通过食用油、甜面酱、加热、卷起来等手段结合到一起,形成了美味的

qq_33253182的博客 2813

10.【C++进阶】多态

本文深入解析C++面向对象编程中的多态特性。首先区分了编译时多态(函数重载、模板)和运行时多态(虚函数机制),重点阐述了动态多态的实现条件:基类指针/引用调用虚函数,且完成虚函数重写。详细讲解了虚函数重写规则、协变、析构函数重写等关键概念,并通过代码示例演示了多态的实际应用。文章还剖析了多态底层原理,包括虚函数表机制和动态绑定过程,对比了静态多态与动态多态的区别。最后介绍了抽象类和纯虚函数的特性,说明其强制派生类重写的机制。全文通过丰富的代码实例和图示,帮助读者深刻理解C++多态的核心概念和实现原理。

E_han的博客 857

强化学习代码实现PPO

梯度更新:通过截断(clipping)限制策略更新幅度,避免策略变化过大影响稳定性。首先是数据预处理,将相关数据(状态、采取的动作、状态奖励、下一个状态)放到gpu上。根据当前状态 state,利用策略网络生成每个动作的概率分布 probs。2. 修改了策略模型的输出,从每个动作的概率分布变成了动作的均值和方差。1. 修改了动作空间,离散空间变成了连续空间,使用正太分布来采样。3. 修改了动作的ratio的计算,从离散分布变成了正太分布计算。Update函数:通过经验缓冲数据来优化策略模型和价值模型。

wlxsp的博客 635

【C++进阶】多态要这样学才够清楚

深入理解多态,一步到位

小羊的博客 2974

手把手教你用STM32CubeMX和HAL库驱动MT6835磁编码器(SPI读取21位角度)

本文详细介绍了如何使用STM32CubeMX和HAL库驱动MT6835磁编码器,通过SPI接口读取21位高精度角度数据。从硬件准备、CubeMX配置到HAL库驱动实现与优化,提供了完整的实战指南,帮助开发者快速掌握磁编码器的应用技巧,适用于机器人关节和精密仪器等高精度场景。

weixin_28716769的博客 439

AJ-Report开源数据大屏存在远程命令执行漏洞

该平台可以通过post方式在validationRules参数对应值中进行命令执行,可以获得服务器权限,登陆管理后台接管大屏。如果被攻击者利用,危害后果十分严重。

swordheart的博客 387

C++进阶-多态

【C++进阶学习】C++中的多态零、前言一、多态的概念和定义二、虚函数1、概念和定义2、虚函数重写的特例3、C++11 override 和 final4、重载/重写/重定义对比三、抽象类四、多态的原理1、虚函数表2、多态的原理3、动态绑定与静态绑定4、多继承虚函数表五、继承和多态常见的面试问题 零、前言 C++有五大特性:对象,封装,继承,抽象和多态。而本章则将学习讲解C++中的多态 一、多态的概念和定义 概念: 通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同

~ 2219

最新Codex接入DeepSeek官方API教程(无需cc-switch)

最新Codex接入DeepSeek官方API教程(无需cc-switch)

猿小白的博客 935

★ C++进阶篇 ★ 多态

★ C++进阶篇 ★ 多态

2302_80328146的博客 1819

2023年全国职业院校技能大赛“信息安全管理与评估”-真题——赛题题目+答案解析

2023年全国职业院校技能大赛“信息安全管理与评估”-真题——赛题题目+答案解析

君逍遥o 5990

地方政府预算数据抓取:利用Python爬虫获取预算安排、资金分配与支出情况

爬虫是通过模拟浏览器行为,从互联网上自动获取数据的程序。在本案例中,我们将通过爬虫从地方政府的官方网站或预算公开平台抓取各类预算信息。这些信息一般以HTML网页的形式呈现,可以通过爬虫对网页内容进行解析,提取所需的预算数据。Python作为数据抓取的强大工具,凭借其简洁的语法、强大的第三方库(如requestsSelenium等)以及丰富的数据处理能力,成为了开发爬虫应用的首选语言。

2201_76125261的博客 941

C++进阶之多态

多态的概念 多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写 4.虚函数重写的两个例外 5.C++11 override 和 final 6.重载、覆盖(重写)、隐藏(重定义)的对比 抽象类 1.概念 2.接口继承和实现继承 多态的原理 1.虚函数表 2.多态的原理 3.动态绑定与静态绑定 单继承和多继承关系的虚函数表 1.单继承中的虚函数表 2.多继承中的虚函数表 继承和多态常见的面试问题

立志做一个高产且细节博主 875

注意力机制与经典 CV 网络:PyTorch 实现与实战

注意力机制(SE/空间/CBAM/Non-Local)通过权重重标定让模型聚焦关键特征,经典 CNN(ResNet/DenseNet/FPN)提供了深层网络、特征复用和多尺度融合的基础骨架。建议先在 ResNet 上插入 SE 模块(通道注意力)做基线实验,再根据任务类型引入空间注意力(分割任务)或非局部注意力(视频任务)。CIFAR-10 数据集适合快速验证注意力模块的有效性,迁移到更大数据集时保持相同的结构设计思路即可。

FJN110的博客 62

[cpp进阶]多态和虚函数

文章目录多态的概念 多态的概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。 C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。 比如说: 买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优先买票。 买票这一个行为,不同的人做就有不同的行为和结果,这就是多态。 ...

weixin_53027918的博客 1242

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【C++进阶】多态

对象中的这个指针我们叫做虚函数表指针(v代表virtual,f代表function)。一个含有虚函数的类中都至少都有一个虚函数表指针,因为虚函数的地址要被放到虚函数表中,虚函数表也简称虚表 这里我们要注意:只要有虚函数就有虚函数表

m0_74459304的博客 1341

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【C++进阶学习】第四弹——多态——迈向C++更深处的关键一步

【C++进阶学习】关键一步——多态的学习与应用,多态是面试是很重要的一个知识点,建议这章认真观看!!!

2301_80220607的博客 5484

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C++进阶:继承和多态

面向对象编程中的一个核心概念,它允许对象以多种形式出现,并通过相同的接口来调用不同的实现。在 C++ 中,多态通常通过函数重载、运算符重载和虚函数来实现。多态的主要类型包括编译时多态(静态多态)和运行时多态(动态多态)。简单来说多态就是:就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。例如:每个动物都有叫声,我们将叫声写为一个函数,然后每个动物去继承这个 动物类,每个动物去调用叫声这个函数都会得到不同的结果,这就是多态。

2301_79969994的博客 1864

【C++进阶——多态】

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。那么在继承1. 必须通过基类的指针或者引用调用虚函数2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写public:cout << "Person->全价" << endl;virtual void BuyTicket()//被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写cout << "Student->半价" << endl;//必须通过基类的指针或者引用调用虚函数int main()

m0_74303551的博客 1006

【C++进阶02】多态

虚函数的重写(覆盖),协变,多态的原理,虚函数表

2302_76421042的博客 3913

《C++进阶之继承多态》【多态:概念 + 实现 + 拓展 + 原理】

本文介绍了C++中多态的概念、实现方式和底层原理。文章分为静态多态和动态多态两类。重点讲解了动态多态的实现条件:继承关系、虚函数重写和基类指针/引用调用。还介绍了协变返回类型等细节,并分析了虚函数表的多态实现机制。全文系统梳理了多态从概念到实践的关键知识点。

序属秋秋秋的博客 1400

C++进阶之——多态

本文章详细解答了多态的定义和原理,而且提供许多大厂考过的原题

xiaosuai168的博客 1072

C++进阶:多态

文章目录多态1. 多态的概念1.1 虚函数虚函数的定义重写的构成条件重写条件的例外1.2 多态的构成条件多态的效果1.3 重载重写隐藏对比重载重写隐藏1.4 final & overridefinal 修饰类final 修饰虚函数override2. 抽象类2.1 纯虚函数和抽象类2.2 接口继承和实现继承实现继承接口继承3. 多态的原理3.1 虚函数表虚表指针虚表的底层原理3.2 多态的实现原理3.3 动态绑定与静态绑定4. 不同继承关系的虚函数表4.1 单继承的虚函数表4.2 多继承的虚函数表4

yourfriendyo的博客 759

【C++进阶(九)】C++多态深度剖析

本篇文章着重讲解C++多态的概念以及定义,深度剖析多态的底层原理:虚函数指针和虚函数表.后面讲解了抽象类和虚函数对于类的默认成员函数的一些小结论,最后讲解了为什么析构函数最好定义为虚函数(最好重写)

杭电码农-NEO的博客 4026

C++进阶——多态

本文系统介绍了C++多态的核心概念与实现机制。主要内容包括:1. 多态分为编译时多态和运行时多态;2. 实现运行时多态需要满足:基类虚函数、派生类重写虚函数、通过基类指针/引用调用;3. 详细解析了虚函数表的工作机制,包括虚函数表指针的存储位置、派生类虚函数表的构成原理;4. 介绍了协变、析构函数重写等特殊情况,以及override/final关键字的使用;5. 对比了重载、重写和隐藏的区别;6. 讲解了纯虚函数和抽象类的特性与用途。通过底层汇编分析和内存模型图示,深入阐释了动态绑定的实现原理。

Linux、C++、图形软件开发等。不一定每次都能写出完美的代码,但会认真搞懂每一个问题。 2186
上一篇: 《C++进阶--9.继承》
下一篇: 《C++进阶--11.文件操作》
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿!=程序员

感谢来过,感谢有你!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值