参考
Run-Time Type Information
Casting Operators
Dynamic Casting in C++ - The Cherno on Youtube
RTTI(Run-Time Type Information)
RTTI机制的功能是在运行时检查对象的类型。缘起于各个外部库中设置了这样的机制,导致库之间不兼容、复杂度升高,C++将RTTI机制变成了语言特性。RTTI的作用对象主要是指针。
下行转换与dynamic_cast
博客中提到的dynamic_cast
的作用皆是利用动态类型检查保证了类型转换的安全性,却鲜有人能通俗地说出为什么下行转换是不安全的。
我的理解:
首先,dynamic_cast
的操作数一定要是多态的。那么在这样的情况下,下行转换后,在调用子类接口实现时,有可能会错误地调用其他子类的实现。具体来讲,当你将一个基类指针暴力地转换为其子类地指针时,你并不知道这个指针指向的对象是不是你以为的子类类型。
这种情况在非多态情境下不会出现,所以给dynamic_cast
传非多态类型指针是没有意义的。在编译时会出现报错。
error C2683: “dynamic_cast”:“Vehicle”不是多态类型
下面给出一个例子来观察dynamic_cast
的行为。
首先我们给出一个抽象载具类
#include <iostream>
#define _USING_DYNAMIC_CAST
#define _NOT_LYING
// Abstract Vehicle class
class Vehicle
{
public:
void _move()
{
std::cout << "I move. " << std::endl;
}
virtual void _special() = 0;
};
然后通过继承实现两个不同种的载具,Sedan
和Tank
。
// Derived Sedan class
class Sedan : public Vehicle
{
public:
void _special()
{
std::cout << "I am comfortable! " << std::endl;
}
};
// Derived Tank class
class