咱们在面向对象中可能会出现这样的状况:基类指针指向子类对象、基类引用成为子类对象的别名。以下ios
静态类型便指的是变量(对象)自身的类型,动态类型是指指针(引用)所指向对象的实际类型。基类指针是否能够强制类型转换为子类指针取决于动态类型!下面的这种转换方式是危险的ide
那么咱们在 C++ 中如何获得动态类型呢?解决方案即是利用多态:一、在基类中定义虚函数返回具体的类型信息;二、全部的派生类都必须实现类型相关的虚函数;三、每一个类中的类型虚函数都须要不一样的实现。函数
下来咱们就用代码来分析学习
#include <iostream> #include <string> using namespace std; class Base { public: virtual string type() { return "Base"; } }; class Derived : public Base { public: string type() { return "Derived"; } void print() { cout << "I'm Derived." << endl; } }; class Child : public Base { public: string type() { return "Child"; } }; void test(Base* b) { if( b->type() == "Derived" ) { Derived* d = static_cast<Derived*>(b); d->print(); } cout << dynamic_cast<Derived*>(b) << endl; } int main() { Base b; Derived d; Child c; test(&b); test(&d); test(&c); return 0; }
咱们利用强制类型转换的时候,首先得考虑指向的对象是否是和须要转换的对象是一致的,若是是则进行转换。不然会翻车。咱们看看编译结果spa
咱们看到只输出了 Derived 类。咱们以前说过,在进行继承相关的转换时,最好用 dynamic_cast 关键字,下面咱们将 test 函数中的注释去掉,再来编译看看指针
咱们看到成功实现转换的打印出了地址,没成功的都为 0 了。咱们利用多态成功的实现了动态类型的识别。可是有点小缺陷,就是必须从基类开始经过类型虚函数,全部的派生类都必须重写类型虚函数,每一个派生类的类型名必须惟一。对象
那么在 C++ 中是经过了类型识别关键字的,typeid 关键字用于获取类型信息。typeid 关键字返回对应参数的类型信息,它返回一个 type_info 类对象,当 typeid 的参数为 NULL 时将抛出异常。typeid 的注意事项:当参数为类型时,返回静态类型信息;当参数为变量时,不存在虚函数表则返回静态类型信息,存在虚函数表则返回动态类型信息。继承
下来仍是以代码为例来进行分析图片
#include <iostream> #include <string> #include <typeinfo> using namespace std; class Base { public: virtual ~Base() { } }; class Derived : public Base { public: void print() { cout << "I'm Derived." << endl; } }; class Child : public Base { public: string type() { return "Child"; } }; void test(Base* b) { const type_info& tb = typeid(*b); cout << tb.name() << endl; } int main() { int i = 0; const type_info& tiv = typeid(i); const type_info& tvv = typeid(int); cout << (tiv == tvv) << endl; cout << endl; Base b; Derived d; test(&b); test(&d); return 0; }
咱们打印 i 和 int 的信息应该是一致的,因此应该打印出 1。来看看编译结果编译器
咱们来看看若是不定义虚函数呢,看看编译结果
咱们看到若是定义了虚函数的话,打印的即是动态类型的;没定义的话,打印的即是静态类型的。下来咱们再用 BCC 编译器来看看结果
咱们看到 typeid 关键字在不一样的编译器上打印的行为是有点区别的。经过对类型识别的学习,总结以下:一、C++ 中有静态类型和动态类型的概念;二、利用多态可以实现对象的动态类型识别;三、typeid 是专用于类型识别的关键字,它可以返回对象的动态类类型信息。
欢迎你们一块儿来学习 C++ 语言,能够加我QQ:243343083。