C++ 多态性虚函数和动态绑定学习笔记

 更新时间:2023年10月26日 09:33:51   作者:Totn  
这篇文章主要为大家介绍了C++ 多态性虚函数和动态绑定学习笔记,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

C++ 多态性

C++中的多态性通过虚函数和动态绑定来实现, 下面简单介绍一下多态的实现:

  • 虚函数:在基类中声明虚函数,通过在成员函数前面加上virtual关键字来标识。虚函数允许子类对其进行重写(覆盖),从而实现多态。基类中的虚函数只有函数声明,没有具体的实现。
  • 动态绑定:基于对象的类型来选择调用的函数,而不是基于指针或引用的类型。在编译时,编译器会根据指针或引用的静态类型进行函数调用;而在运行时,根据指针或引用所指向的对象的实际类型来决定调用哪个函数。这种在运行时确定调用的函数称为动态绑定。
  • 虚函数表(vtable):编译器会为每一个包含虚函数的类生成一个虚函数表,该表存储了虚函数的地址。对象的内存布局中会包含一个指向虚函数表的指针,称为虚函数指针(vptr)。虚函数指针指向当前对象的虚函数表,通过虚函数表来找到具体的虚函数地址。
  • 多态调用过程:当通过指针或引用调用虚函数时,首先会根据指针或引用的静态类型找到对应的虚函数表,然后根据虚函数表中的偏移量找到具体的虚函数地址,最终调用对应的函数。

示例代码

class Animal {
public:
    virtual void sound() {
        std::cout << "动物能叫" << std::endl;
    }
};
class Dog : public Animal {
public:
    void sound() override {
        std::cout << "Dog's voice sounds like Wangwang." << std::endl;
    }
};
class Cat : public Animal {
public:
    void sound() override {
        std::cout << "Cat's voice sounds like Miaomiao." << std::endl;
    }
};
int main() {
    Animal* animalPtr;
    Dog dog;
    Cat cat;
    animalPtr = &dog;
    animalPtr->sound();  // 输出: Dog's voice sounds like Wangwang.
    animalPtr = &cat;
    animalPtr->sound();  // 输出: Cat's voice sounds like Miaomiao.
    return 0;
}

在上述示例中,Animal类是基类,DogCat类分别是派生类。它们都重写(覆盖)了基类的sound函数。通过基类指针animalPtr指向不同的派生类对象,并调用sound函数。在运行时,根据指针所指向的对象的实际类型来选择调用哪个函数,实现了多态性。

总之,C++中的多态通过虚函数和动态绑定来实现。虚函数允许子类对其进行重写,动态绑定根据对象的实际类型来确定调用哪个函数。使用虚函数表和虚函数指针来实现动态绑定。这种机制能够提供更灵活的代码设计和对象行为的多样性。

以上就是C++ 多态性虚函数和动态绑定学习笔记的详细内容,更多关于C++ 多态虚函数动态绑定的资料请关注脚本之家其它相关文章!

相关文章

  • Qt MQTT开发环境搭建的实现示例

    Qt MQTT开发环境搭建的实现示例

    本文主要介绍了Qt MQTT开发环境搭建的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 如何用c语言完成俄罗斯方块小游戏

    如何用c语言完成俄罗斯方块小游戏

    这篇文章主要介绍了如何使用C语言开发一个简单的俄罗斯方块游戏,涵盖了游戏设计、数据结构、核心逻辑和实现步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-12-12
  • 图解AVL树数据结构输入与输出及实现示例

    图解AVL树数据结构输入与输出及实现示例

    这篇文章主要为大家介绍了C++图解AVL树数据结构输入与输出操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • C语言入门篇--定义宏#define的概述

    C语言入门篇--定义宏#define的概述

    本篇文章是C语言系列基础篇,适合c语言刚入门的朋友,本文对关于c语言的定义宏#define作了简要的概述,希望可以帮助大家快速入门c语言的世界,更好的理解c语言
    2021-08-08
  • 手拉手教你如何理解c/c++中的指针

    手拉手教你如何理解c/c++中的指针

    当你对C越来越熟悉时,你会发现把与指针搅和在一起的"类型"这个概念分成"指针的类型"和"指针所指向的类型"两个概念,是精通指针的关键点之一,这篇文章主要给大家介绍了关于c/c++中指针的相关资料,需要的朋友可以参考下
    2021-10-10
  • C++ LeetCode1796字符串中第二大数字

    C++ LeetCode1796字符串中第二大数字

    这篇文章主要为大家介绍了C++ LeetCode1796字符串中第二大数字示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • C语言实现简单的文本编辑器

    C语言实现简单的文本编辑器

    这篇文章主要为大家详细介绍了C语言实现简单的文本编辑器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • C语言简明讲解三目运算符和逗号表达式的使用

    C语言简明讲解三目运算符和逗号表达式的使用

    三目运算符,又称条件运算符,它是唯一有3个操作数的运算符,有时又称为三元运算符。三目运算符的结合性是右结合的;逗号表达式,是c语言中的逗号运算符,优先级别最低,它将两个及其以上的式子联接起来,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值
    2022-04-04
  • C语言container of()函数案例详解

    C语言container of()函数案例详解

    这篇文章主要介绍了C语言container of()函数案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C语言实现个人财务管理软件

    C语言实现个人财务管理软件

    这篇文章主要为大家详细介绍了C语言实现个人财务管理软件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05

最新评论