
1 dynamic 引入
多重继承&交叉转换 -> 恢复 "丢失的" 多态对象类型信息: user 用 多重基类1的 ptr 指向 多态对象时, 不知道其中是否含 多重基类2
2 dynamic_cast<T>(p) 要点 & 应用
(1) 运行时检测 多态对象 是否含 预期(非多态/多态)类型
调 vf/nvf 却 不用 虚调用机制
(2) 多重继承(多重基类) & 交叉/向下 转换
1) 实现类 -> 接口类: pw 指向 1个 Ival_box 吗
2) 接口类 -> 实现类: 通过 对象 I/O 系统 传输 具体类型数据 , dynamic_cast 解析 出 具体类型数据
目标类型 T 不必是 多态的: 可在 多态类型 中包含 具体类型
3) 目标类型 为 void: 求多态对象 起始地址
(3) 是 运算符 , 接受 2 个 运算对象: 类型 + ptr/ref
(5) dynamic_cast 要求 ptr/ref 指向 多态类型 (否则 找不到 vptr/vtbl/RTTI_ptr -> 报错)
=> 简化了 dynamic_cast 的 实现 : 类型信息 ptr 放在 多态类型 vtbl
(6) 用于 类型转换
dynamic_cast 转换到 protected 基类 结果为 空指针 , 不能 转换到 private 基类
3 设计角度: 恢复接口(实现类 -> 接口类) , 即 dynamic_cast 询问对象 是否提供了指定 接口
对象 I/O 系统: 从 istream 解析出 objSmartPtr -> dynamic_cast<Shape>(spget() ) 检查 internal ptr 若为 指定 接口类型指针, 则 转换/恢复为 接口类型指针
想 以 类型安全的方式 传输 任意对象 , 本例给出了 "接收端" 的1个 "蓝本"
Io_obj(抽象基类1) 类层次 & Shape(抽象基类2) 类层次
version1: 具体 Shape 派生自 Io_obj
version2: 借助 抽象基类 (Io_obj) 将 another 类层次中 具体类型(Circle) 纳入到 已有 类层次(Io_obj)`
version3: 模板形参 T 作基类 , 模板实参用 具体类型
version4: 模板形参 T 作 成员 , 模板实参用 具体类型
4 转换 引用类型
1) dynamic_cast<T>(p) / dynamic_cast<T&>(r)
[1] 是 询问 / 断言
[2] result 必须 (由 程序员) 显式检查 / 已隐含 被 dynamic_cast 实现 检查过了
5 static_cast 和 dynamic_cast
dynamic_cast 可从 多态虚基类 转换到 派生类 或 兄弟类, static_cast 不行
(2) static_cast 在 类层次中导航 的意义
从 非虚基类 转换: 不检查 要转换的对象 , 靠 coder 保证 转换的有效性, 没有 dynamic_cast 的 运行时额外开销
1 双重分发: 依次为 2个 多态类型 的 *** 作数 s1 和 s2 选择 正确的 同名 vf 版本
2 访客
(1) Ctor 中某个点 对象的 (动态) 类型 仅反映 当前已构造完成部分
=> 类层次 中 类 Ctor 中调 vf 是 本类或更上层类 中的 version , 原因: 对象 还不是 更深层次类的 对象
(2) 可在 对象未完成的某个点 调 vf / dynamic_cast / typeid 观察 Ctor/Dtor 过程
0 typeid <type_info>: 返回它所处理的对象的类型
RTTI 的正确使用场景: 如 用 RTTI 实现 对象 I/O 系统(2211)
微软 Dynamics 365 是微软新一代云端智能商业应用,通过对 CRM&ERP 的完美整合,助力企业成长及数字化转型。
Dynamics 365 通过交付无缝协作且针对特定用途的全新云端应用,帮助企业重塑生产力及业务流程,并通过与Azure、Office 365、Power BI 等微软重磅产品的无缝集成,为企业带来全业务流程的数字化转型升级,进而让企业增强市场适应能力和业务创新能力,突破成长瓶颈,顺利实现数字化转型!
扩展资料:
Microsoft Dynamics 365 四大价值
1、按需起步
与现有IT资源整合,定制化的流程;在信息孤岛之间打通业务流程,更快将线索转化为营收;根据自己的发展节奏按需购买, 适应企业和市场的变化。
2、随时高效
与微软其他产品,如Office 365,Outlook无缝集成;用户界面袭承“一个微软”的风格,利用熟悉的 *** 作方法快速上手、产出;跨设备统一体验,适配于iOS,安卓,Windows和网页版。
3、智能内置
在所有的功能点和业务环节都有内置的智能系统支持;开箱即用的可视化数据与商业智能,轻松获得深度的商业洞察;变革性的高级分析平台,提供准确的预测和实用的信息。
4、灵活扩展
全应用共享数据模型,可实现多应用的功能组合;利用PowerApps和Microsoft Flow无代码编写业务程序,任务流程自动化;可随时在现有业务上添加新功能,也可以快速、平缓地调整运营模式。
Mads Tersen给大家展示了C#中dynamic关键字的更多详细信息 以及它的一些具体用法 并谈及在选用dynamic关键字之前 一些最终被废弃的替代设计方案 C# 将通过新的元类型 dynamic 来添加对后期绑定的支持 任何直接声明为这种类型的变量 或者从函数中返回这种类型的值 都将自动地视为后期绑定 这类似于在Visual Basic中把变量声明为 object 不过它现在可以支持任何类型系统了 不仅仅是CTS(通用类型规范)和 一个重要之处是 这个特性的目标就是为了支持后期绑定 以及更多地为了支持近来流行的动态绑定 动态类型明显不是C#的一个特性译者注 意指C#是静态语言 本来无需动态类型的 不过是为了支持动态绑定的一个后果 还要着重注意的一点是 反射并不是一种很好的替代方案 使用反射的问题在于 需要处理各种各样的类型 使用Reflection命名空间调用方法的方式和在ScriptObject上调用方法的方式并不相同 尤其 Ruby/Python方法这样的第三方方法 一种选择是用波形号作为动态 *** 作的前缀 可惜 这种方式马上也变得难以使用 尤其在你开始研究类型转换 数组索引和数学 *** 作符的地方
object d = GetDynamicObject(); string result = ~(string) d ~[ d~ Length ~ ];下一个曾考虑过的选择是动态上下文 类似unsafe和unchecked上下文那样 你能够标注任意的代码块为 dynamic 这种方式的问题在于 它很难把静态和动态代码混合在一起 这种方式书写的代码类似下面
dynamic { //some dynamic code static { //some statically bound code dynamic { //some dynamic code in some static code } //some more statically bound code } //some more dynamic code }第三种方案是传播性的表达式 由于表达式的动态本质将产生向上传播的问题
object d = GetDynamicObject(); string result = (string) d[ dynamic(d) Length ];当然 它们选择的语法也不够完美 虽然可以让大家轻易地读懂代码 但是没有任何东西来表明一个动态调用是在实际Call Site当中被创建出来的 唯一看到的信息是这个变量在哪里声明的
dynamic d = GetDynamicObject(); string result = (string) d[d Length ];选用这种设计的关键原因是 代码未必真的不够安全 进行动态调用本身就像之前抛出异常那样 不过现在你不用编写所有臃肿 易出错的反射逻辑了 另外一个曾考虑过的选择是用dynamic修饰符来代替元类型 使用这种模式的代码如下所示 开发人员能够早期绑定到Foo的方法上 而不是在任何东西上进行后期绑定 虽然这样可以在一些边界情况下提高性能 不过它却增加了总体的复杂等级 这样的复杂度是难以接受的
dynamic Foo d = GetDynamicFooObject();
每逢动态组件进入到表达式中 整个表达式将可能成为动态的 这包括
方法调用 程序调用 成员访问 *** 作符运用 索引访问
lishixinzhi/Article/program/net/201311/15534
静态初始化,只适用于拥有静态存储期(static storage duration)的变量。拥有静态存储期的变量是:
举例:
拥有静态存储期的变量,在程序运行之前就分配了空间。更确切的说,是在编译成目标文件或者把可执行文件装载到内存中的时候分配的空间。
什么是静态初始化呢?
静态初始化,指的是在程序开始运行之前,就对变量进行了初始化。
静态初始化包含两种情况,zero initialization和constant initialization。
zero initialization指的是初始化为0,constant initialization指的是初始化为常量表达式的值。
造成这两种初始化的区别的根本原因是,具有静态存储期的变量的存储位置不同。
众所周知,具有静态存储期的变量(不考虑const)存储在data段和bss段。其中data段存储的是,用常量表达式初始化的变量;bss段存储的是没有常量表达式来初始化的变量。
总结来说, static initialization只是针对static storage duration的变量的概念,分为zero initialization和constant initialization。
相对的概念,除了静态初始化之外的全部都是动态初始化。
首先,非静态存储期的变量都是动态初始化。例如:
其次,静态存储期的变量也有可能动态初始化。例如:
但是上面是的过程就不是单纯的动态初始化,而是静态初始化和动态初始化的结合。首先装载时给变量分配地址空间,进行zero initialization,然后程序运行时再调用(构造)函数进行dynamic initialization。
具有静态存储期的变量一般都是存在data段和bss段,但是const修饰的变量是例外。const 修饰的变量和一些字符串字面量在rodata段或者text段,这取决于编译器的实现。对于gcc编译器而言,这些变量在text段。
对于静态初始化,如果constant initialization的常量表达式是0的话,那么编译器一般将其视为zero initialization,即变量在bss段而非data段。这样做有助于减小可执行文件的大小。
例子:
确认你装的是不是eclipse ide for java EE,这版本集成了tomcat等服务器插件。如果没有,去>
以上就是关于22章 RTTI / 运行时类型信息全部的内容,包括:22章 RTTI / 运行时类型信息、微软Dynamics 365 是什么、C#动态特性的更多消息等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)