来自新世界:RTTI和类型转换运算符

RTTI元素

  • dynamic_cast 运算符将使用一个指向基类的指针来生成一个指向派生类的指针。否则返回一个空指针。
  • typeid 运算符返回一个指出对象的类型的值
  • type_info 结构储存了有关特定类型的信息

上代码:

#include <iostream>
using namespace std;
class A{
    private:
      int i;
    public:
    A(int j):i(j){}
    virtual void show(){
        cout << "this is A:" << i << endl;
    }
};
class B:public A{
    private:
      int k;
    public:
    B(int o,int p):A(o),k(p){}
    void show(){
        cout << "this is B:" << k << endl;
    }
    void hello(){
        cout << "fuck" << endl;
    }

};
int main(){
    A *p = new B(5,1000);
    B *pai = new B(100,66);
    /*if(p = dynamic_cast<B*>(pai))  //利用派生类指针生成派生类指针赋给基类指针
    {
        p->show();
        cout << "successful" << endl;
    }*/
    if(pai = dynamic_cast<B*>(p))  //利用基类指针生成派生类指针赋给派生类类指针
    {
        pai->show();
        cout << "successful" << endl;
    }
    
}

结果是:

 

dynamic_cast在将父类cast到子类时,父类必须要有虚函数!!

具体有什么用呢?

其实就是基类指针可以指向它的派生类,但是有时候通过基类指针会调用到基类没用的方法,这时我们就可以用这个转换去通过使用一个基类指针来生成一个派生类指针再赋给其他指针,从而进行灵活的运用而不是通过typeid 和 if else 来判断这个基类指针指向的到底是什么类,再把操作写进去

类型转换运算符

上面说的dynamic_cast就是一种,而其他的还有像const_cast可以通过指针改变被const指针指向的值:

High bar;
const High *p_bar = &bar;
High *pb const_cast<High *>(p_bar); //这样使得 pb 可以修改 bar 指向的对象

但是如果对象本来就是const,那终究是修改不了的。

发布者

我乃堂堂SCUT的一条咸鱼!

发表评论

电子邮件地址不会被公开。 必填项已用*标注