RTTI RAII

RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型。
RTTI提供了以下两个非常有用的操作符:
(1)typeid操作符,返回指针和引用所指的实际类型。
(2)dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用。
typeid:
int val = 1;
cout<<typeid(val).name()<<endl;  int
 
#include<iostream>
#include <typeinfo>
using namespace std;
class Base {};
class Derived : public Base {};
int main(int argc, char *argv[])
{
    Base *b = new Derived();
    cout<<typeid(b).name()<<endl;   //P4Base
    cout<<typeid(*b).name()<<endl;  //4Base
    return 0;
}
当typeid操作符的操作数是不带有虚函数的类类型时,typeid操作符会指出操作数的类型,而不是底层对象的类型。
#include<iostream>
#include <typeinfo>
using namespace std;
class Base {
    virtual void disp() {}
};
class Derived : public Base {};
int main(int argc, char *argv[])
{
    Base *b = new Derived();
    cout<<typeid(b).name()<<endl;   //P4Base
    cout<<typeid(*b).name()<<endl;  //7Derived
    return 0;
}
 
dynamic_cast:
该转换符用于将一个指向派生类的基类指针或引用转换为派生类的指针或引用,注意dynamic_cast转换符只能用于含有虚函数的类,其表达式为dynamic_cast<类型>(表达式),其中的类型是指要将表达式转换成的目标类型,比如含有虚函数的基类B和从基类B派生出的派生类D,
B *pb;
D *pd, md;
pb=&md;
pd=dynamic<D*>(pb);
dynamic_cast转换符只能用于指针或者引用。dynamic_cast转换符只能用于含有虚函数的类。
为什么dynam_cast 必须要求转换的类型之间要有虚函数?否则编译通不过?
明显RTTI info 存在于虚表的第一项。第二个问题就可以回答,因为RTTI 依赖于虚表,所以用dynamic_cast 对应的类一定要有虚函数
 
RAII (Resource Acquisition Is Initialization),也称为“资源获取就是初始化”,是C++语言的一种管理资源、避免泄漏的惯用法。
简单的说,RAII 的做法是使用一个对象,在其构造时获取资源,在对象生命期控制对资源的访问使之始终保持有效,最后在对象析构的时候释放资源。
class Resource
{
public:
Resource() {/*分配资源*/}
~ Resource() {/*释放资源*/}
private:
int handle;
};
为什么要使用RAII?
上面说到RAII是用来管理资源、避免资源泄漏的方法。那么,用了这么久了,也写了这么多程序了,口头上经常会说资源,那么资源是如何定义的?在计算机系统中,资源是数量有限且对系统正常运行具有一定作用的元素。比如:网络套接字、互斥锁、文件句柄和内存等等,它们属于系统资源。由于系统的资源是有限的,就好比自然界的石油,铁矿一样,不是取之不尽,用之不竭的,所以,我们在编程使用系统资源时,都必须遵循一个步骤:
1.申请资源;
2.使用资源;
3.释放资源。 
posted @ 2019-07-25 17:37  小兵07  阅读(540)  评论(0编辑  收藏  举报