type
date
status
slug
summary
tags
category
icon
password
网址
1.你是如何理解重载、覆盖(重写)、隐藏(重定义)。 2.虚表 3.虚析构函数的作用。 4.静态绑定?动态绑定?(详细说) 5.C++的4种类型转换?应用场景? 6.RTTI (Runtime Type Identification)是“运行时类型识别 " 7.多重继承与虚函数
 
1.C++四种类型转换方式 风格的强制类型转换很简单: (type_name) expression; C语言的类型转换不适用C++语言, 例如:C++ 中的const 指针强转为非const, 也可以在不同类类型指针之间实现强转。 实例:
C语言强转不容易查找,它有一个括号和一个标识符组成,而这样的东西在C++程序中一大堆。 C语言强转的意义不明确,其他程序员读代码时不知道你强转的目的是是什么? C++语言为了克服这些缺陷,引进了四种类型转换操作符。 1、static_cast; 2、const_cast; 3、reinterpret_cast ; 4、dynamic_cast
1.static_cast
用法:static_cast<type_name> (expression) 说明:该运算符把expression转换为typen_name类型, static_cast 在编译时使用类型信息执行转换,在转换执行必要的检测(诸如指针越界计算, 类型检查等);但没有运行时类型检查来保证转换的安全性。
使用范围:
  1. 用于基本类型间的转换, 如把int转换成char,把int转换成enum。
2) 指针转换的限制
3) 可以就void * 转换为其他类型
4) 弃值表达式
5) 左值转到右值
6) 用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。 进行上行转换(把派生类的指针或引用转换成基类表示)是安全的; 进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。
注意: 隐式执行任何类型转换都可由static_cast显示完成。 static_cast不能转换掉expression的const、volatile、或者__unaligned属性。 2.const_cast
用法:const_cast (expression) 说明:该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, typename和expression的类型是一样的。
特点:
  1. 用于去除变量的只读属性
  1. 强制转换的目标类型必须是指针或引用
注意: 常量指针被转化成非常量的指针,并且仍然指向原来的对象; 常量引用被转换成非常量的引用,并且仍然引用原来的对象; 3.reinterpret_cast 用法:reinpreter_cast (expression) 说明:type_name必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针。类似C语言的强转。 特点: 用于指针类型间的强制转换 用于整数和指针类型间的强制转换 注意: reinterpret_cast主要是将数据从一种类型的转换为另一种类型。所谓“通常为操作数的位模式提供较低层的重新解释”也就是说将数据以二进制存在形式的重新解释。
4 . dynamic_cast 语法:dynamic_cast < typen_ame> ( expression ) 说明:dynamic_cast 操作符, 它允许在运行时刻进行类型转换 ,从而使程序能够在一个类层次结构中安全地转换类型, 把基类指针转换成派生类指针,或把指向基类的左值转换成派生类的引用。必须是公有继承,基类要有虚函数。
特点:
  1. 与C++支持的其他强制转换不同的是, dynamic_cast 是在运行时执行的类型转换。
  1. 如果针对指针类型的 dynamic_cast 失败, 则dynamic_cast 的结果是 nullptr。
  1. 如果针对引用类型的 dynamic_cast 失败, 则 dynamic_cast 会抛出一个异常。
  1. 在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。
  1. 在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。
实例:
上行转换:
总结: 必须是公有继承, 可以没有虚函数, 都是静态转换。
下行转换:
总结: 基类中必须至少有一虚函数,否则编译失败。
必须测试 dynamic_cast 操作符的结果来检验转换是否成功。
下行转换(引用)
总结: 使用异常给程序增加了相应的运行开销 ,所以尽可能使用指针的 dynamic_cast。
void 型指针
总结: 一个void*真实的意思是"无类型信息"。
物品分类程序
为了更进一步地举例说明RTTI的实际用途,下面的程序模拟了一个物品生成器。不同种类的"物 品"被插入一个容器中,然后根据它们的动态类型进行分类。
静态类型转换, static_cast, const_cast ,reinterpret_cast ; 5.RTTI : RTTI (运行时类型识别 ) :允许"用指向基类的指针或引用来操纵对象" 的程序能够获取到," 这些指针或引用所指对象" 的实际派生类型。 在C++中为了支持 RTTI 提供了两个操作符:
  1. typeid 操作符,它在程序中可用于获取一个表达式的类型 ; 查询类型的信息, 类型身份认证。它指出指针或引用指向对象的实际派生类型。
  1. dynamic_cast 操作符可以用来把一个类类型对象的指针,转换成同一类层次结构中的其他类的指 针 ,同时也可以用它把一个类类型对象的左值,转换成同一类层次结构中其他类的引用。 dynamic_cast 和 typeid 操作符的操作数的类型 ,必须是带有一个或多个虚拟函数的类类型。 即对于 带有虚拟函数的类而言 RTTI 操作符是运行时刻的事件 ,而对于其他类而言,它只是编译时刻的事件。 1.获得类型的信息:
2 . 可以进行比较运算
与模板函数结合
在所有情况下, typeid 都忽略顶层的 cv 限定符 。
当应用于多态类型的表达式时,typeid 表达式的求值可能涉及运行时开销(虚表查找),其他情况下typeid 表达式都在编译时解决。
在C++中,提供了一个类,管理这个全局的数据结构,这个数据结构就是type_info; typeid 操作符实际上返回一个类型为 type_info 的类对象。
type_info 类
C语言多态实例 1.单个函数
2.有多个操作函数,我们可以再建个结构体变量(函数表)把这些函数再包一层,这样会更清晰些。
以上的代码实现了简单的多态的功能。
第一个例子中我们的操作函数(虚函数)只有一个,即area函数。