如果没有继承,类只是具有一些相关行为的数据结构,这只是对过程语言的一大改进,而继承则开辟了完全不同的新天地。通过继承,可以在已有类的基础上创建新类。这样,类就成为可重用和可扩展的组件。博主的《漫谈继承技术》系列博文将讲述各种利用继承功能的方法。学习继承的语法,和利用继承的一些复制技术。本篇博文先给大家介绍一下typeid在继承中的使用,希望对大家加深对继承技术的理解有一定的帮助。
typeid
typeid是C++的一个关键字,用它可以获得一个类的相关信息。
它有两种语法形式:
typeid(表达式);
或
typeid(类型说明符);
通过typeid得到的是一个type_info类型的const引用。type_info是C++标准库中的一个类,专用于表示运行时类型信息,它定义在typeinfo头文件中。type_info类有一个名为name的函数,用来获得类型的名称。
虽然typeid可以作用于任何类型的表达式,但只有它作用于多态类型的表达式时,进行的才是运行时类型识别,否则只是简单的静态类型信息的获取。咱们举个栗子吧。
#include <iostream>
using namespacestd;
class super
{
public:
//编译器默认生成的析构函数是非虚函数,所以建议在任何时候都自己
//编写虚析构函数,即使它什么也不做(只是表面上什么也没做)
virtual~super(){}
virtualvoidfun(int nValue);
};
void super::fun(intnValue)
{
cout<< __FUNCTION__ << " nValue:"<< nValue << endl;
}
//sub类继承super类
class sub: public super
{
public:
virtual~sub(){}
virtualvoidfun(int dValue) override;
};
void sub::fun(intdValue)
{
__super::fun(dValue);
cout<< __FUNCTION__ << " dValue:"<< dValue << endl;
}
int main(intargc,char**argv)
{
//基类指针指向堆上的派生类对象
super *pSp = new sub();
super &ref = sub();
consttype_info& timeinfo = typeid(*pSp);
cout<< "timeinfo: "<< timeinfo.name() << endl;
consttype_info& timeref = typeid(ref);
cout<< "timeref: "<< timeref.name() << endl;
consttype_info& type = typeid(pSp);
cout<< "type: "<< type.name() << endl;
consttype_info& typeinfo = typeid(string);
cout<< "typeinfo: "<< typeinfo.name() << endl;
//释放资源
deletepSp;
//将基类指针置为nullptr,避免野指针
pSp = nullptr;
return0;
}
程序运行结果:
pSp是指针,指针本身不具有多态类型,是什么类型的指针就输出什么类型的信息。而*pSp得到的是pSp指针所指向对象的具体类型(具有多态类型),输出的是所指向对象的类型信息,即class sub。ref引用了派生类对象,也属于多态类型。string是C++内建类型,其实string是std::basic_string模板类的实例,我们上次在 http://blog.youkuaiyun.com/tf_apologize/article/details/53260315一文中总结了字符串的用法,如果遗忘了,那就回去再回顾一下吧。
注意:指针本身不具有多态类型,指针所指向的对象具有多态类型。
如果想了解更多关于继承技术相关的知识,请关注博主《漫谈继承技术》系列博文,相信你能够在那里寻找到更多有助你快速成长和深入你对继承相关的知识和一些复制的技术理解和掌握。