首页 > 编程语言 >c++ RTTI Runtime Type Identification 运行阶段类型识别

c++ RTTI Runtime Type Identification 运行阶段类型识别

时间:2022-08-21 21:26:55浏览次数:122  
标签:NvirBase cast 默认 Identification c++ b0 RTTI RttiTestDerivd2 构造函数

NoVirtualBase* NvirBase = new NovirtualDerivd();

    NvirBase->print();

   // auto nd1 = dynamic_cast<NovirtualDerivd*>(NvirBase);//必须有虚方法

    auto nd11 = static_cast<NovirtualDerivd*>(NvirBase);
    nd11->print2();
    nd11->print();
    delete NvirBase;
dynamic_cast 需要有虚方法的类,否则无法通过编译 这没有虚方法时,父子类转换用static_cast。 static_cast向上得行,向下没有发生类型转换也得行。
std::cout << "============================rtti static_cast====================\n";
   RttiTestBase* b0 = new RttiTestBase();
     auto* b7 = static_cast<RttiTestDerivd2*>(b0);
    if (b7 == nullptr) {
        std::cout << "b7 can not\n";
    }
    else {
        std::cout << "b7 can\n";
        b7->say2();
        b7->say3();
    }
    delete rd1, rd2, b0;
以上代码 从基类对象 b0 向下转换成子类RttiTestDerivd2,发现可以调用只有RttiTestDerivd2这个类里面拥有得方法say3。感觉很神奇。书上说无需进行类型转换就可以,不是很明白。估计那些超类里得成员变量都时默认值吧。 而且最根本得父类得有默认构造函数,我试了,如果根父类没有默认构造函数,向下转换时不行得。 比如RttiTestDerivd2作为间接子类和他得直接父类RttiTestDerivd(代码没给出来)都没有默认构造函数,而RttiTestBase(根父类)却是有一个隐藏得默认构造函数,这种情况下,这种向下转换在我这种情况下是可以得。 如果RttiTestDerivd2里有一个其他类对象 比如A,那么这个A也需要有默认构造函数,我试了,如果没有默认构造函数,是在运行阶段回报错,报错原因是没有合适得构造函数。   const_cast 能把一个const指针变为普通指针。

标签:NvirBase,cast,默认,Identification,c++,b0,RTTI,RttiTestDerivd2,构造函数
From: https://www.cnblogs.com/HelloQLQ/p/16610876.html

相关文章

  • C++反序列化--一种基于class infomation反射库的反序列化数据结构
    序列化与反序列化概念:将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的另一台计算机上以实现通讯。这个将程序数据转化成能被存储并传输的格式的......
  • 【C++】 基本知识点
     strcmp()函数用法及其详解原型:intstrcmp(constchar*s1,constchar*s2);头文件:#include<string.h>功能:用来比较两个字符串参数:s1、s2为两个进行比较的字符串,......
  • c++ 友元类 友元类方法
    一、友元类#pragmaonce#include"Tv.h"classRemote{public:voidchanDown(Tv&tv);};#pragmaonceclassTv{public:friendclassRemote;voidchandown......
  • C++指针
    两种声明方式int*p=newint;*p=1000;inta=1000;int*p=&a;数组名和指针的区别指针的值可以修改,数组名是常量。pointerName=pointerName+1;//v......
  • C++之vector
     一、标准库函数1.构造数组——参考博客一维数组构造://构造一维数组vector<int>vec(n);//n为vec长度,默认所有值为0vector<int>vec(n,1);......
  • 360se_getdbkey_c++
    关联:360安全浏览器历史记录、收藏夹  下载链接:https://files.cnblogs.com/files/DirWang/360se_getdbkey.zip?t=1661006095......
  • c++ lambda学习举例
    #include<iostream>#include<vector>#include<algorithm>#include<cmath>#include<ctime>usingstd::cout;usingstd::vector;usingstd::srand;usingstd::time......
  • C++数据类型
    整型C++标准short:>=2字节int:>=shortlong:>=4字节,>=intlonglong:>=8字节,>=longlinux系统short:2字节int:4字节long:4字节longlong:8字节int被设置为计算机......
  • 深度学习 之 模型部署【4】-libtorch入门 - pytorch部署torchscript 以及 c++ libto
    pytorch部署torchscriptfromtorchvision.modelsimportresnet34importtorch.nn.functionalasFimporttorch.nnasnnimporttorchimportcv2#读取一张图片,......
  • Effective C++ - 条款3 - 关于const的一切
    const与*符号左侧为所指对象的语义,符号右侧为指针自身语义const与iteratorconstiterator(是T*const)!=const_iterator详细原因应参考c++编译和c++设计与演化const......