96SEO 2026-02-23 11:32 10
当我们需要抽象一个类的时候#xff0c;我们就需要用到纯虚函数。

所谓抽象的类…1.final
final在继承和多态中都可以使用在继承中是指不想将自己被继承在多态中是指不想该函数被重写比较简单下面是一些使用例子。
当我们需要抽象一个类的时候我们就需要用到纯虚函数。
所谓抽象的类是指高度概括的需要针对不同事物有不同处理的。
如植物是一种抽象的类而像苹果、香蕉就是具象的单独讨论植物太过庞大没有太大意义因此我们的重心放在由植物具象出来的苹果我们可以具体讨论它的成分、营养价值等。
理解了这个例子就能理解为什么有抽象类纯虚函数的存在了。
0它对应的类就叫抽象类。
注意只要有一个纯虚函数这个类就叫抽象类抽象类不能被实例化就算你不打算用这个纯虚函数。
唯一能做的就是调用这个类里面的static成员因为它们不需要实例化就能调用
这么做的意义就在于纯虚函数对应的类本身就高度抽象实例化它没有意义。
但我们可以讨论将它具象化的事物这就要用到虚函数的重写功能。
我们可以理解纯虚函数存在的意义是依赖于虚函数的性质存在的这里需要我们深刻思考。
继承、多态的用法、意义几乎讲的差不多了绝大多数情况下已经够用了只不过在极少数情况下仍有一些坑。
我们需要知道当构成多态和重写时调用函数是以父类声明子类定义进行的对于三个类及以上都是如此这个父类指的是构成多态的父类
我们也可以进一步理解为什么只需要父类写virtual子类可以不写因为子类的函数声明根本没有意义在多态中写不写都是以父类的声明为标准。
但是在多态语法以外就不会出现这种反直觉处理情况了。
先看看下面的代码想想test2的隐含的this指针是B*还是A*
}既然是B*调用函数那理所应当应该是B*为形参来接受啊但实际不是这么理解的。
当子类去调用父类的成员函数时隐含的指针类型始终是父类的。
要理解这里我们假设这个指针的类型是子类的那如果子类又写了一个一模一样的函数构成隐藏那么就会因为参数和假设的函数完全相同而报错所以是行不通的。
当子类调用父类时this指针会发生一次赋值兼容转换这里是从B*赋值兼容转换为A*赋值兼容转换为指针只会影响访问的方式指针的值指向的内容都不会改变。
但学了多态之后我们是否可以将这种特性和多态的形成条件结合起来呢上面这段代码就是如此。
我们要理解访问限定符限制的是什么是防止其它类调用private的函数这里p是一个指针本身就指向B对象的空间只不过访问方式按A进行。
由于符合多态的条件就按虚函数表进行访问。
那么问题在于B会不会阻止呢
我们发现无论在A还是在main函数中都没有办法调用B中的private成员这也符合我们之前的预期。
但是为什么A*
事实上这是多态中的特殊处理当我们用父类的指针或引用来访问子类的虚函数时是会以父类的访问限定符为标准的。
子类的限制不会起到作用。
同理就算子时public父是private那么就无法访问。
如何理解
当以父类的指针和引用调用虚函数时是按照虚函数表的地址直接去调用函数根本不会经过类调用函数只会受到调用方父类的访问限定符的限制。
动静态绑定都是为了定位一个函数从反汇编的角度上讲就是确定call的对应的地址是什么只不过两者的方式有一定的区别。
1动态绑定多态调用函数的核心时动态绑定也叫运行时绑定。
也就是借助虚函数表在这个函数指针数组中确定函数的地址。
2静态绑定我们平时写的函数都可以认为是静态绑定包括函数重载、普通函数、模板函数函数如果声明定义在一起就在编译后进符号表如果声明定义分离在两个文件则在链接时进符号表运行时是根据符号表来查找函数。
在多态中在满足动态绑定的情况下我们指定类域调用函数那就自动转为静态绑定就失去了多态的特性。
2函数第一句的指令理解为函数的地址成员函数要打印它们的地址函数名前要加其余函数函数名就是它的地址可加可不加但成员函数一定要加
3cout打印地址很麻烦char*不会打印地址会按字符串去打印这跟流插入的重载有关。
有几个关于函数指针的重载会导致出现bug打印地址很受阻最好使用printf
4关联性强的类型之间支持隐式类型转换如整型家族double内置类型、指针之间有的支持强转如int和int*。
关联性弱的自定义类型想取头地址可以使用*((int*)Base)虚函数表的地址就在类的开头
5只有virtual修饰的成员函数才能叫作虚函数而像static修饰的成员函数、全局函数都不能定义为虚函数全局定义的虚函数没有意义static修饰的成员函数不属于对象就算加了virtual也进不了虚函数表没有意义。
6virtual修饰的成员函数声明定义分离时定义处不写virtual
8多继承可能有多张虚函数表按继承顺序排序但单继承对应的就只有一张虚函数表如果多继承后自己又写了虚函数则默认放在第一张虚函数表后面
9如果不重写虚函数那共用同一个函数如果所有的函数都不重写两个类存的函数的地址都相同但是这对应两张虚函数表开辟的是不同的空间
10虚函数表是在编译期间就形成了。
而多态是动态绑定运行时绑定/晚期绑定是因为编译时编译器只负责检查语法错误而不负责读取内容只有运行起来才知道函数调用的地址。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback