C++多态虚函数的底层原理是什么(C++,开发技术)

时间:2024-05-01 21:25:22 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

这篇“C++多态虚函数的底层原理是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++多态虚函数的底层原理是什么”文章吧。

    1多态的基本概念

    1.1 什么是多态?

    • 多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为,通常是父类调用子类的重写函数,在C++中就是 父类指针指向子类对象,此时父类指针的向下引用就可以实现多态

    比如看下面的代码:

    classAnimal{public://虚函数virtualvoidspeak(){cout<<"动物在说话"<<endl;}virtualvoideat(inta){cout<<"动物在吃饭"<<endl;}};classCat:publicAnimal{public:voidspeak(){cout<<"小猫在说话"<<endl;}voideat(inta){cout<<"小猫在吃饭"<<endl;}};classDog:publicAnimal{public:voidspeak(){cout<<"小狗在说话"<<endl;}};

    这两个类实现集成关系,简单来说就是 Animal是父类,Cat是子类,通过父类引用调用子类函数,这就是多态(字面意思就是一个对象多个状态),这样就 符合** 高内聚低耦合** 的设计原则,更容易 后期维护与修改

    1.2 怎么实现多态

    说了这么多,那么多态到底怎么实现呢?

    • 想必上面代码中也已经透露出了一些信息,并且十分关键。没错,就是virtual,字面意思是 虚拟的,而也的确如此,这个关键字修饰的 函数,叫做虚函数,拥有虚函数的 类,被称为抽象类(虚类),virtual是实现多态的必要不充分条件

    • 同时 ,子类要重写父类的虚函数,什么叫重写?就是函数类型,函数名,参数列表完全相同。

    • 并且父类指针还要指向子类对象,

    正如下所示:

    voiddoSpeak(Animal&animal)//Animal&animal=cat;{animal.speak();}voidtest01(){Catcat;doSpeak(cat);Dogdog;doSpeak(dog);}

    如此方能满足实现多态的三个条件:

    • 注:如果没有多态,那么父类指向子类时就无法调用子类函数,也就是此时该函数地址早就绑定好了,只能是animal说话,属于静态联编(静态);如果想调用小猫说话,这个时候函数的地址就不能早就绑定好,而是在运行阶段再去绑定函数地址,属于地址晚绑定,叫动态联编,(动态)多态的实现就是依靠动态联编。

    2 虚函数的底层原理

    那么虚函数到底是怎么工作的呢?

    voidtest02(){Animal*animal=newCat;((void(*)())(*(int*)*(int*)animal))();typedefvoid(__stdcall*FUNPOINT)(int);(FUNPOINT(*((int*)*(int*)animal+1)))(10);}
    Animal*animal=newCat;

    就是animal->speak();

    ((void(*)())(*(int*)*(int*)animal))();

    这里*(int *)animal解引用到虚函数表中,先将animal类型的指针强转为int *,然后解引用得到int类型的值放到虚函数表中,然后偏移相应位置指向speak()

    ((void(*)())(*(int*)*(int*)animal))();

    C++多态虚函数的底层原理是什么

    C++多态虚函数的底层原理是什么

    调用猫说话,因为C/C++默认调用惯例__cdecl,而用下列调用时 是__stdcall

    typedefvoid(__stdcall*FUNPOINT)(int);(FUNPOINT(*((int*)*(int*)animal+1)))(10);

    C++多态虚函数的底层原理是什么

    C++多态虚函数的底层原理是什么

    以上就是关于“C++多态虚函数的底层原理是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。

    本文:C++多态虚函数的底层原理是什么的详细内容,希望对您有所帮助,信息来源于网络。
    上一篇:IntelliJ IDEA 2022.2最新版本如何激活下一篇:

    25 人围观 / 0 条评论 ↓快速评论↓

    (必须)

    (必须,保密)

    阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18