前言本文主要给大家介绍的是关于C面向对象之多态的实现和应用的相关内容分享出来供大家参考学习下面话不多说了来一起看看详细的介绍吧。多态大家应该都听过C三大特性之一多态那么什么多态呢多态有什么用通俗一点来讲-多态性可以简单地概括为“一个接口多种方法”程序在运行时才决定调用的函数它是面向对象编程领域的核心概念。当多态应用形参类型的时候可以接受更多的类型。当多态用于返回值类型的时候可以返回更多类型的数据。多态可以让你的代码拥有更好的扩展性。多态分两种分别为静态多态和动态多态静态多态静态多态就是重载因为是在编译期决议确定所以称为静态多态。动态多态动态多态就是通过继承重写基类的虚函数实现的多态因为是在运行时决议确定所以称为动态多态。而我们主要今天来看动态多态的问题。比如我们来看下面的代码就是简单的动态多态123456789101112131415161718192021222324252627282930313233343536373839404142classPerson{public:virtualvoidBuyTickets(){cout 买票 endl;}protected:string _name;// 姓名};classStudent :publicPerson{public:virtualvoidBuyTickets(){cout 买票-半价 endl;}protected:int_num;//学号};voidFun(Person p){p.BuyTickets();}voidTest(){Person p;Student s;Fun(p);Fun(s);}intmain(){Test();system(pause);return0;}构成多态的四大条件: (缺一不可)1.不在同一作用域分别在父类和子类2.函数名相等/参数相等/返回值相同/协变除外3.基类函数必须有virtual关键字4.访问修饰符可以不同具体多态是如何实现的 这里我们先从虚函数表这个知识点讲起每一个带有虚函数的对象都会有一个虚函数表虚函数表里存的是函数指针然后调用的时候指针回去虚函数表里面访问查找。对于这个知识点我的另外一个博客很详细的讲解到大家可以先看看这个:C中继承与多态的基础虚函数类详解_C 语言_脚本之家然后我们来了解一下重写是什么东西?重写的过程如果这块还是不理解你可以看我专门写虚函数那片博客仔细看一定会看懂的.接下来多态的原理我们就明白了吧. 发生重写之后下一次父类指针指向我调用fun()函数的时候它调用到的就是子类的fun(函数其实多态就是这么简单只要理解重写就理解多态. 虚函数表是我们必须掌握的一个知识点.通过汇编来分析多态的实现好了我们继续往下走刚刚我们从虚函数表这方面探究了多态的实现现在我们再从汇编的角度再来看多态是如何实现的。我们来看一段新的代码123456789101112131415161718192021222324252627282930313233343536373839404142classPerson{public:virtualvoidBuyTickets(){cout 买票 endl;}protected:string _name;// 姓名};classStudent :publicPerson{public:virtualvoidBuyTickets(){cout 买票-半价 endl;}protected:int_num;//学号};voidFun(Person p){p.BuyTickets();}voidTest(){Person p;Student q;Person* ptr q;p.BuyTickets();ptr-BuyTickets();}intmain(){Test();system(pause);return0;}打开我们的反汇编窗口这里我们看到用指向子类的父类类型指针调用BuyTickets函数和直接用对象调用汇编代码相差巨大一个只有2句话一个那么长这是因为在发生多态时当你用指针调用时系统不知道你要用哪一个函数因为这里有多态现象所以系统只能老实的去虚函数表里查找所以才会有这么多的代码接下来我们来解释一下这些汇编来看看系统是调用虚表的。这里我们就关心到了那四个红色的句子可以看到这里一直都是想讲虚函数表的地址传给系统然后再传this指针就可以调用哪个函数了。蓝色的就是一个小知识~ 知道有这么个东西就好了.