C++中的类型识别

你。 提交于 2020-02-16 01:14:58

1 C++中的类型识别

1.1 类型识别的基本概念

在面向对象中可能出现下面的情况:

  • 基类指针指向子类对象。
  • 基类引用成为子类对象的别名。

在这里插入图片描述
静态类型和动态类型的概念:

  • 静态类型:变量(对象)自身的类型。
  • 动态类型:指针(引用)所指向对象的实际类型。

在这里插入图片描述

1.2 利用多态得到动态类型

利用多态得到动态类型:

  1. 在基类中定义虚函数返回具体的类型信息。
  2. 所有的派生类都必须实现类型相关的虚函数。
  3. 每个类中的类型虚函数都需要不同的实现。

编程实验:动态类型识别

#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 printf()
    {
        cout << "I'm a Derived." << endl;
    }
};

class Child : public Base
{
public:
    string type()
    {
        return "Child";
    }
};

void test(Base* b)
{
    /* 危险的转换方式 */
    // Derived* d = static_cast<Derived*>(b);
    
    if( b->type() == "Derived" )
    {
        Derived* d = static_cast<Derived*>(b);
        
        d->printf();
    }
    
    // cout << dynamic_cast<Derived*>(b) << endl;
}


int main(int argc, char *argv[])
{
    Base b;
    Derived d;
    Child c;
    
    test(&b);
    test(&d);
    test(&c);
    
    return 0;
}


动态解决方案的缺陷:

  • 必须从基类开始提供类型虚函数。
  • 所有的派生类都必须重写类型虚函数。
  • 每个派生类的类型名必须唯一。

1.3 typeid关键字

C++提供了typeid关键字用于获取类型信息:

  • typeid关键字返回对应参数的类型信息。
  • typeid返回一个type_info类对象。
  • 当typeid的参数为NULL时将抛出异常。

typeid关键字的使用:
在这里插入图片描述
typeid的注意事项:

  • 当参数为类型时:返回静态类型信息。
  • 当参数为变量时:
    • 不存在虚函数表时,返回静态类型信息。
    • 存在虚函数表,返回动态类型信息。

编程实验:typeid类型识别

#include <iostream>
#include <string>
#include <typeinfo>

using namespace std;

class Base
{
public:
    virtual ~Base()
    {
    }
};

class Derived : public Base
{
public:
    void printf()
    {
        cout << "I'm a Derived." << endl;
    }
};

void test(Base* b)
{
    const type_info& tb = typeid(*b);
    
    cout << tb.name() << endl;
}

int main(int argc, char *argv[])
{
    int i = 0;
    
    const type_info& tiv = typeid(i);
    const type_info& tii = typeid(int);
    
    cout << (tiv == tii) << endl;
    
    Base b;
    Derived d;
    
    test(&b);
    test(&d);
    
    return 0;
}



参考资料:

  1. C++深度解析教程
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!