首页 > 编程语言 >C++(虚函数实现多态基本原理)

C++(虚函数实现多态基本原理)

时间:2024-08-06 10:07:27浏览次数:11  
标签:函数 基本原理 派生类 多态 C++ 基类 speak 指针

目录



在C++中,加上 virtual 关键字可以实现多态,这是因为它允许函数在基类和派生类中有不同的实现,并确保在运行时正确调用派生类的方法。具体来说,这种机制称为“动态绑定”或“运行时多态”。



1. 概念

  1. 虚函数(Virtual Function)
    当你在基类中声明一个函数为 virtual 时,C++ 会为该函数在类的对象中创建一个虚函数表(vtable)。虚函数表是一个指针数组,其中每个元素指向类中虚函数的实现。每个类对象都有一个指向其虚函数表的指针(vptr)。

  2. 虚函数表(vtable)
    虚函数表包含了指向该类中虚函数实现的指针。基类和每个派生类都有自己的虚函数表。基类中的虚函数表包含基类中虚函数的地址,派生类中的虚函数表则可能包含不同的地址,指向派生类中重写的虚函数实现。

  3. 动态绑定(Dynamic Binding)
    当通过基类指针或引用调用虚函数时,C++ 运行时会通过虚函数表来决定实际调用哪个类的实现。这意味着,即使你使用的是基类的指针或引用,实际调用的仍然是派生类的实现,这取决于指针或引用所指向的对象的实际类型。



2. 示例

假设你有以下类结构:

class Animal {
public:
    virtual void speak() {
        cout << "动物在说话" << endl;
    }
};

class Cat : public Animal {
public:
    void speak() override {
        cout << "小猫在说话" << endl;
    }
};

如果你创建一个 Cat 对象并通过 Animal 指针调用 speak 方法:

Animal* animal = new Cat();
animal->speak();

虽然 animalAnimal 类型的指针,但因为 speak 是虚函数,程序会使用 animal 对象的 vptr,查找 Cat 的虚函数表,并调用 Cat 类中实现的 speak 方法。这会输出 小猫在说话



3. 总结

加上 virtual 关键字使得函数调用可以在运行时根据对象的实际类型动态决定调用哪个函数,从而实现了多态。虚函数表和虚函数指针的机制允许不同类型的对象在运行时执行正确的函数实现,这是面向对象编程中多态性的核心特性。



标签:函数,基本原理,派生类,多态,C++,基类,speak,指针
From: https://www.cnblogs.com/keye/p/18344598

相关文章

  • C++11革新之旅:探索C++编程的无限可能
    C++11革新之旅:探索C++编程的无限可能C++11,作为C++语言的一个重要标准,为C++编程带来了革命性的变革。它不仅引入了众多新特性和改进,还极大地增强了C++的表达能力、提高了程序的性能和资源利用率。本文将从多个方面深入探讨C++11的新特性,并解析这些特性如何改变C++编程的方式......
  • windows C++-使用 C++/WinRT 创作 API(一)
    这个系列中的"投影”不太好有准确的翻译,它的原文是"projection",最开始我觉得可能翻译为实现,但C++本身也有"实现(implementation )",这两个不同的词翻译为一个总觉得怪怪的。本文展示了如何直接或间接使用winrt::implements基本结构来拓展创作C++/WinRTAPI。在此上......
  • windows C++-使用 C++/WinRT 创作 API(二)
    可扩展应用程序标记语言(XAML)是一种声明性语言。具体来讲,XAML可初始化对象和设置对象的属性,使用一种可显示多个对象间分层关系的语言结构,还使用了一种支持类型扩展的支持类型约定。可以在声明性XAML标记中创建可见的UI元素。然后,可以为每个XAML文件关联单独的代码隐藏......
  • C++ 拷贝构造函数语义与移动构造函数语义
    拷贝构造函数语义与移动构造函数语义一、拷贝构造函数语义1.编译器生成拷贝构造函数的条件2.自定义拷贝构造函数3.深拷贝与浅拷贝4.拷贝构造函数的使用场景5.拷贝赋值运算符6.规则五(RuleofFive)二、移动构造函数语义1.禁止生成移动构造函数2.生成移动构造函数......
  • Codeforces Round 963 (Div. 2) A - C 详细题解(思路加代码,C++,Python) -- 来自灰名
    比赛链接:Dashboard-CodeforcesRound963(Div.2)-Codeforces之后有实力了再试试后面的题目,现在要做那些题,起码要理解一个多小时题目A:链接:Problem-A-Codeforces题目大意理解:        极少数不考翻译能读懂的cf题目(bushi)每个测试用例第一行一个n,......
  • 继承和多态
    继承继承:继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。生活中的继承:继承的概述:继承是面向对象程序设计的一个重要特征......
  • C++_Const的相关知识点
    1.修饰函数参数,表示函数不会修改参数当const修饰函数参数时,表示函数内部不会修改该参数的值。这样做可以使代码更加安全,避免在函数内部无意中修改传入的参数值。尤其是引用作为参数时,如果确定不会修改引用,那么一定要使用const引用。voidfunc(constinta){......
  • C++ exe程序内存占用分析
    编译 $gitclonehttps://github.com/google/bloaty$cdbloaty$cmake-Bbuild-GNinja-S.$cmake--buildbuild$cmake--buildbuild--targetinstall命令bloaty.exe --list-sourcesrmembersthe.ofilesina.afilecompileunitssourcefile......
  • 【C++ 面试 - 基础题】每日 3 题(一)
    ✍个人博客:Pandaconda-CSDN博客......
  • 多态的可扩展性动物行为实例 day09
    packagecom.shujia.day09;importjava.nio.channels.Pipe;/*多态的好处1、提高了程序的维护性(由继承保证)2、提高了程序的扩展性(由多态保证)*/classAnimal{Stringname;intage;publicAnimal(){}publicAnimal(S......