首页 / 资讯中心 / 文章详情

c++进阶之多态

c++进阶之多态 ★ FEATURED ARTICLE
一.概念以及分类运行时(动态)多态多个不同种类的对象在运行某个相同接口(功能)时构成的不同结果达到不同的状态就叫做动态多态。eg:编译时(静态)多态主要是函数模板或是函数重载可传不同参数得到不同结果进而达到不同状态。由于实参传给形参在编译阶段所以叫做编译时多态。由于把编译时归为静态执行时归为动态所以才有了动态多态和静态多态之分。二.虚函数前面菱形继承中为解决二义性与冗余在父类继承方式前也有添加virtual那这里的virtual和菱形继承里的有什么关系吗答案是没有。virtual算一鱼两吃能代表不同意思。三.定义以及实现1.定义2.多态满足的必要条件①.必须用引用或指针调用虚函数。②.被调用的函数必须是虚函数且派生类必须对基类虚函数进行重写。重写基类虚函数和其对应的派生类虚函数的返回值类型函数名参数列表(形参类型个数顺序)必须完全相同函数体可不相同。我将举一下代码的例子带大家在代码中明白上面段落的含义。但在查看代码前先对调用虚函数时的传参规则进行明晰也是对上一章继承篇中赋值兼容转换的一个复习。赋值兼容转换对于指针也是如此。Func函数中ptr这个基类指针形参既可以传指向基类的指针也可以传指向派生类的指针(赋值兼容转换)。通过控制指针的指向进而调用不同类的虚函数最终实现不同状态。#includeiostream using namespace std; class person { public: virtual void Buyticket() { cout 全价 endl; }//子类和父类对应虚函数需要返回值函数名相同函数内容可不同。 }; class student : public person { public: virtual void Buyticket(){ cout 半价 endl; } }; //利用基类指针对不同类虚函数进行调用以实现多态。 //通过控制传给基类形参的实参类型进而调用不同类里的虚函数这里传参还用到了赋值兼容转换即把派生类赋值给子类 void Func(person* ptr)//用指针调用虚函数 { ptr-Buyticket(); } int main() { person p; student s; Func(p); Func(s); return 0; }注意1.基类虚函数的virtual不能去掉去掉以后就无法满足多态了。但在派生类的虚函数里virtual是能去掉的虽然不规范但依旧能满足重写。2.不同派生类间也能构成多态3.特殊语法——析构函数的重写语法如果基类派生类的析构函数名字不同均带有virtual,那么两个析构函数也能满足多态。原理若基类和派生类的析构函数带上了virtual,则系统会将两个析构函数的函数名特殊处理成destructor(函数名就相同了),那么基类和派生类的析构就构成了多态(派生类的析构构成了重写)。产生该语法的原因(为什么基类析构建议设计为虚函数)这么设置是为了服务于下面这个情景注delete的底层是ptr-destructor operator delete(free)先做个假设AB的析构不满足多态关系。那么delete时ptr是什么类型的指针就会去调用什么类的析构。此时p1,p2全是基类A*类型的指针就会全去调用A类的析构但是p2身在曹营心在汉虽然是A*类的指针但指向B类的空间A类的析构释放不掉B类的空间就会造成空间的泄漏。那如果满足多态关系delete时究竟调用哪个类的析构(destructor)这是由指向空间的类型所决定的。4.override和final关键字overridefinal5.重载/重写/隐藏的对比常考重点注隐藏也叫重定义。6.纯虚函数和抽象类四.多态的原理1.虚函数表指针先通过一道老六题引入虚函数表指针这个概念注指针所占大小与其指向内容无关与系统位数有关。32位下指针占4字节64位下指针占8字节。被老六肘击的一幕读完题目咳这不是考内存对齐吗so easy, int4个字节char1个字节对齐3个字节一共8字节选C。but.....man,what can I say?!正解让我们调用监视窗口在b这个对象的构成里潜藏着一个虚函数表指针就是我们接下来要探讨的东西。虚函数表指针从上图我们可以看出b的成员还包括一个指针__vfptr该指针指向一片区域,该区域存储类里所有虚函数的地址。由此我们可以看出虚函数表就是指那片区域是个存放类里所有虚函数地址的数组。而指针__vfptr指向虚函数表所以它就叫虚函数表指针。2.多态的原理借助虚函数表指针这个概念我们来剖析多态的原理。多态里生成一种状态的底层原理流程注杭哥的图同一个意思综上当传不同对象经以上流程生成不同状态就构成了多态。3.动态绑定和静态绑定4.再探虚表——for面试
阅读完成 · 觉得有帮助?
咨询建站