C++三大特性

您所在的位置:网站首页 多态虚函数纯虚函数区别 C++三大特性

C++三大特性

2023-12-19 17:55| 来源: 网络整理| 查看: 265

抽象类和虚函数表是 C++中实现多态性的重要概念,它们对于学习 C++非常重要。 掌握抽象类和虚函数表的使用方法对于理解 C++的多态性是非常重要的。在 C++中,通过使用抽象类和虚函数表,可以实现基于多态性的各种功能,如继承、多态、模板等。同时,在实际应用中,抽象类和虚函数表也是常用的设计模式之一,如抽象工厂模式、观察者模式等。

抽象类接口继承和实现继承 虚函数表多继承关系的虚函数表

抽象类

在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。

 和普通的虚函数不一样,一个纯虚函数无需定义。而且 =0 只能出现在类内部的虚函数声明处。我们也可以为虚函数提供定义,不过函数体必须定义在类的外部。也就是说,我们不能在类的内部为一个纯虚函数提供函数体。

class Person { public: virtual void work() = 0;//纯虚函数 }; class Student : public Person { public: virtual void work() { cout cout cout cout cout cout // 依次取虚表中的虚函数指针打印并调用。调用就可以看出存的是哪个函数 cout Base b; Derive d; VFPTR * vTableb = (VFPTR*)(*(int*)&b); PrintVTable(vTableb); VFPTR* vTabled = (VFPTR*)(*(int*)&d); PrintVTable(vTabled); return 0; }

思路:取出b、d对象的头4bytes,就是虚表的指针,前面我们说了虚函数表本质是一个存虚函数指针的指针数组,这个数组最后面放了一个nullptr 1.先取b的地址,强转成一个 int * 的指针 2.再解引用取值,就取到了b对象头4bytes的值,这个值就是指向虚表的指针 3.再强转成 VFPTR *,因为虚表就是一个存VFPTR类型(自己重定义的虚函数指针类型)的数组。 4.虚表指针传递给PrintVTable进行打印虚表 5.需要说明的是这个打印虚表的代码经常会崩溃,因为编译器有时对虚表的处理不干净,虚表最后面没有放nullptr,导致越界,这是编译器的问题。我们只需要点目录栏的 - 生成 - 清理解决方案,再编译就好了。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述 相同类型的对象共用一个虚表

多继承关系的虚函数表

且看下面代码分析:

class Base1 { public: virtual void func1() { cout public: virtual void func1() { cout public: virtual void func1() { cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3