C++——C++中的类型识别

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

(1)基类指针指向子类对象

(2)基类引用成为子类对象的别名

静态类型------变量(对象)自身的类型

动态类型------指针(引用)所指向对象的实际类型

基类指针是否可以强制类型转换为子类指针取决于动态类型,若指针指向子类就可以转换,指向父类就无法转换,所以C++中如何得到动态类型

解决方案:利用多态

  • 在基类中定义虚函数返回具体的类型信息

  • 所有的派生类都必须实现类型相关的虚函数

  • 每个类中的类型虚函数都需要不同的实现

    #include
    #include
    using namespace std;
    class Base {
    public:
    virtual string type() {
    return "Base";
    }
    };
    class Derived :public Base {
    public:
    string type() {
    return "Derived";
    }
    void print() {
    cout << "Derived" << endl;
    }
    };
    class Child :public Base {
    public:
    string type() {
    return "Child";
    }
    };
    void test(Base* b) {
    // Derived* d = static_cast<Derived*>(b); 危险的转换方式
    cout << b->type() << endl;
    if (b->type() == "Derived") {
    Derived* d = static_cast<Derived*>(b);
    d->print();
    }
    cout << dynamic_cast<Derived*>(b) << endl; //dynamic_cast只能显示转换是否成功,但是无法知道转换后的结果
    }
    int main() {
    Base b;
    Derived d;
    Child c;
    test(&b);
    test(&d);
    test(&c);
    }

运行结果:

Base

0000000000000000

Derived

Derived

00000014E231F698

Child

0000000000000000

但是上述方式的缺陷

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

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

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

注意事项

  • 当参数为类型时:返回静态类型信息

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

    #include
    #include
    #include
    using namespace std;
    class Base {
    public:

    };
    class Derived :public Base {
    public:
    void printf() {
    cout << "Derived" << endl;
    }
    };

    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& tii = typeid(int);
    cout << (tiv == tii) << endl; //1
    Base b;
    Derived d;
    test(&b); //class Base
    test(&d); //class Base
    return 0;
    }

由于b指针所指向的对象没有虚函数表,所有返回静态类型信息

复制代码
#include<iostream>
#include<string>
#include<typeinfo>
using namespace std;
class Base {
public:
	virtual ~Base() {

	}
};
class Derived :public Base {
public:
	void printf() {
		cout << "Derived" << endl;
	}
};

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& tii = typeid(int);
	cout << (tiv == tii) << endl; //1
	Base b;
	Derived d;
	test(&b); //class Base
	test(&d); //class Derived
	return 0;
}

存在虚函数表------返回动态类型信息

相关推荐
hold?fish:palm8 分钟前
9 找到字符串中所有字母异位词
c++·算法·leetcode
小大宇14 分钟前
python flask框架 SSE流式返回、跨域、报错
开发语言·python·flask
柒星栈1 小时前
PHP 源码怎么加密防破解?三套方案实战指南
开发语言·php·android studio
勉灬之1 小时前
Next.js + Prisma 跨平台部署踩坑记
开发语言·javascript·ecmascript
这是个栗子1 小时前
前端开发中的常用工具函数(九)
开发语言·javascript·ecmascript·at
啦啦啦啦啦zzzz1 小时前
算法:回溯算法
c++·算法·leetcode
蓝创工坊Blue Foundry2 小时前
图片文字提取到 Excel:批量任务如何先定义要交付的字段
运维·服务器·开发语言·数据库·自动化·ocr·excel
会飞的小新2 小时前
C 标准库之 <fenv.h> 详解与深度解析
c语言·开发语言·microsoft
Lzg_na2 小时前
订阅发布模块事例
c++
郝学胜-神的一滴2 小时前
[简化版 GAMES 104] 现代游戏引擎 02:拆解现代游戏引擎5+1层级架构,吃透引擎底层核心逻辑
c++·unity·架构·游戏引擎·图形渲染·unreal engine·系统设计