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++ 多态虚函数动态绑定的资料请关注脚本之家其它相关文章!

相关文章

  • C语言中对文件最基本的读取和写入函数

    C语言中对文件最基本的读取和写入函数

    这篇文章主要介绍了C语言中对文件最基本的读取和写入函数,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08
  • C语言 文件的随机读写详解及示例代码

    C语言 文件的随机读写详解及示例代码

    本文主要介绍C语言 文件的随机读写,这里整理了相关资料及示例代码以便大家学习参考,学习此部分内容的朋友可以参考下
    2016-08-08
  • C语言递归:汉诺塔问题分析

    C语言递归:汉诺塔问题分析

    这篇文章主要介绍了C语言递归:汉诺塔问题分析的相关资料,需要的朋友可以参考下
    2023-01-01
  • C连接Mysql数据库代码

    C连接Mysql数据库代码

    使用C语言连接Mysql数据库的方法,大家可以看看
    2013-11-11
  • C语言解数独程序的源码

    C语言解数独程序的源码

    这篇文章主要为大家详细介绍了C语言解数独程序的源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • C语言实现五子棋对战系统

    C语言实现五子棋对战系统

    这篇文章主要为大家详细介绍了C语言实现五子棋对战系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C++设计模式之桥接模式

    C++设计模式之桥接模式

    这篇文章主要介绍了C++设计模式之桥接模式,本文讲解了什么是桥接模式、为什么要使用桥接模式、什么时候使用桥接模式等内容,需要的朋友可以参考下
    2014-09-09
  • C语言计算余数的图文步骤

    C语言计算余数的图文步骤

    在本篇文章里小编给大家整理了一篇关于C语言计算余数的图文步骤内容,有需要的朋友们可以参考下。
    2020-02-02
  • 使用C语言计算长方体的表面积和体积

    使用C语言计算长方体的表面积和体积

    这篇文章主要给大家介绍了关于如何使用C语言计算长方体的表面积和体积的相关资料,在C语言中,我们可以使用乘法运算符(*)来进行乘法运算,并将结果保存在一个变量中,需要的朋友可以参考下
    2023-10-10
  • Visual Studio Community 2022(VS2022)安装图文方法

    Visual Studio Community 2022(VS2022)安装图文方法

    这篇文章主要介绍了Visual Studio Community 2022(VS2022)安装方法,本文分步骤通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09

最新评论