扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
重载解析参考自《C++程序设计语言》、《Microsoft C++语言参考》
重载解析的使用不会跨越不同类的作用域。来自不同基类的函数之间的歧义性不能基于参数类型完成解析。如果需要在不同的基类中使用同名函数,需要在使用前使用命名空间声明。(如果参数相同怎么办?)
多继承多重继承提供比单继承更好的灵活性,但是需要在引用部分成员是添加限定。多重继承主要要关注歧义性问题。因为C++查找成员的顺序是如果不能将名称解析为显示引用的类中的成员,编译器就会到该类的基类中找,此时会有三种结果,找到、找不到、有歧义。
虚继承要求多态性的操作对象。因为非多态性的操作对象不包含类型信息。
能够保存一定的运行时需要的对象的类型信息,用于在类的继承和组合关系中进行安全的转换。
适用于基类与派生类之间的转换,兄弟类之间的转换,以及能够由这两种场景复合构成的转换。(向上强制、向下强制、交叉强制)。
由于实现的是安全的类型转换,所以通过if(C2* pc2 = dynamic_cast
,判断指针在类型转换之后的返回值是否为0,来确定是否实现了安全的类型转换。对于引用的转换的合法性,则通过dynamic_cast
本身检查。如果不能实现转换,则会抛出bad_cast
,可以通过try...catch
块设置处理器进行处理。
另外由于编译器不能对void*
所指向的存储提供任何保证,所以dynamic_cast
不能实现从void*
出发的强制转换,因为编译器需要去查看对象,确定类型。此时需要使用static_cast
进行转换。
到void*
的synamic_cast可以用于确定多态类型的对象的起始地址。
如果需要跨系统保存一个非多态类型的对象的类型信息,可以将非多态类型的对象包装在一个要穿过的系统的基类中。然后在需要使用的时候,利用dynamic_cast将对象提取出来。例如:
class Io_obj{virtual Io_obj* clone() = 0;
};
class Io_date : public Date, public Io_obj{};
void f(Io_obj* pio){Date* pd = dynamic_cast(pio);
}
dynamic_cast
实现可用之前,有许多强制转换通过其他机制保证安全。所以dynamic_cast实现的一些操作包含冗余。同时dynamic_cast
具有运行时开销。void*
出发的强制转换。dynamic_cast
保存更多类型信息你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流