首页 > 其他分享 >动态类型和静态类型以及多态

动态类型和静态类型以及多态

时间:2023-08-28 10:25:17浏览次数:37  
标签:函数 静态 Quote 多态 fun 类型 动态

  • 一个对象的静态类型在编译的时候就确定了。
  • 一个对象的动态类型是指它指向的对象或则它绑定的对象(因此只有指针和引用才有动态类型),一个对象的动态类型只有编译的时候才会确定。
1 Quote* p = new b_Quote;  // Quote 是基类,b_Quote 是子类

指针 p 的静态类型是 Quote,在编译时已经确定了,但它的动态类型是 b_Quote,运行时才知道

 1 class Base {
 2 public:
 3     Base() {
 4 
 5     }
 6     virtual void fun() {
 7         cout << "Base function" << endl;
 8     }
 9     void func() {
10         cout << "normal function" << endl;
11     }
12 };
13 class Son :public Base {
14 public:
15     Son() {
16 
17     }
18     void fun() {
19         cout << "Son function" << endl;
20     }
21     void func() {
22         cout << "Son's normal function" << endl;
23     }
24 };
25 
26 int main() {
27     Base* base = new Son;
28     base->fun();
29     Base* base1 = new Son;
30     base1->func();
31 }

编译时编译器会首先确定base的静态类型,然后在静态类型中查找是否有fun()函数,如果没有这个函数则编译器会报错。如果找到了就检查base是否是指针或则引用,fun()是否是虚函数。如果上述条件有一项不满足则该函数的类型就是静态类型,此时确定fun()是静态类型的函数;如果上述都满足那么等到运行时判断它的动态类型,运行时判断它的动态类型后通过动态类型的虚函数指针(在类的前4个字节中,虚函数是属于类的而不是哪个对象的)去找到其所指向的虚函数表,然后在虚函数表中找到该虚函数的地址,并进行调用(虚函数表是一个一维数组,查找虚函数表的时间复杂度是O(1))

 

fun()是虚函数,base2也是指针,因此需要在运行时才能确定fun()是属于哪个类型的,结果在运行时发现是一个空指针,空指针调用函数会引发异常。func()不是虚函数,编译时确定它是静态类型的函数,因此调用静态类型的函数不会报错。

 

标签:函数,静态,Quote,多态,fun,类型,动态
From: https://www.cnblogs.com/Sandals-little/p/17661540.html

相关文章

  • 语言类型详解
    1、编译型语言需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件。优点:编译器一般会有预编译的过程对代码进行优化。因为编译只......
  • 类型别名TypeAlias
    fromcollections.abcimportIterablefromtypingimportTypeAliasFromTo=tuple[str,str]#3.10之前FromTo:TypeAlias=tuple[str,str]#3.10之后推荐使用TypeAliasdefzip_replace(text:str,changes:Iterable[FromTo])->str:forfrom_,toinchange......
  • 某gobfuscate 混淆样本 静态分析
    某gobfuscate混淆样本静态分析gobfuscate主要对字符信息进行混淆,并不能起到有效的对抗效果;可结合函数签名、runtimetypeinfomation进行分析。目录IDApro准备工作Luminaservergo_parsergox64函数调用方式null结构体样本分析字符信息入口点主函数main_main_rm51rvy9rdo......
  • C++11——5.9 强类型枚举
    详细介绍请见:★★★原文链接★★★:https://subingwen.cn/cpp/enum/ 枚举语法(C++98):关键字enum 枚举名字(可以不写,不写就是匿名枚举) {枚举值};#include<iostream>usingnamespacestd;//枚举在相同作用域内全局范围内可见(定义在类内就类内全局可见;定义在全局就全......
  • Makefile练习1:静态库/动态库的生成和使用
    自己动手写下Makefile,并记录备忘。工程目录如下一、生成静态库libAdd.a1、头文件add.h#include<stdio.h>intadd(inta,intb);2、源文件add.c#include"add.h"intadd(inta,intb){ return(a+b);}3、Makefile(1)入门版libAdd.a:add.o ar-rlibAdd.aad......
  • Integer包装类型阅读
    以JDK11为例privatestaticclassIntegerCache{staticfinalintlow=-128;staticfinalinthigh;staticfinalIntegercache[];static{//highvaluemaybeconfiguredbypropertyinth=127;......
  • 架构师必读:揭秘Redis五大数据类型及超实用应用场景!
    大家好,我是你们的小米!今天我们要来聊聊一个在面试中经常被问到的话题:Redis的五种数据类型及其应用场景。作为一名热爱技术的小伙伴,对于这个话题,我们可是要深入挖掘一下哦!String(字符串)String(字符串)类型是Redis最简单的数据类型之一,它不仅可以存储字符串,还可以存储整数和浮点数。在......
  • 一、基本概念和基本类型
    基本概念和基本类型编程语言的分类(概念)1.编译型语言:产生一个额外的文件,电脑能够识别的内容,运行是直接运行编译后的额外的文件。2.解释型语言:不会产生额外的文件,并且运行时翻译,运行时从上到下一行翻译一行。变量(语法)变量的定义:他是一个可变的量(它的值可以发生改变)变量的作用:保存值(......
  • 三个特殊数据类型
    三个特殊数据类型geospatial(地理位置)朋友的定位附近的人查询地理信息数据:城市经纬度查询-国内城市经度纬度在线查询工具(jsons.cn)这个功能在3.2版本就推出了添加城市位置  #geoadd添加地理位置#规则地球两极是无法直接添加的,一般我们会下载城市数据利用Java程序......
  • Struts2的自定义类型转换和简单的输入校验
    这里关键是对自定义类型的理解,它和8个基本数据类型的地位是一样的,只不过这个是你自己定义的类型。那么在Struts2中什么时候要用到数据类型转换呢?其实,我们一直在用,只是我们没有感觉到而已,Struts2对8个基本数据类型以及Date、String等常见类型,会自动的用内建的类型转换器进行转换,这个......