当前位置: 首页 > news >正文

金华市建设银行网站杭州seo软件

金华市建设银行网站,杭州seo软件,ppt做会动彩字网站,wordpress伪静态cdn配置C之dynamic_cast前言dynamic_castNote:示例:前言 dynamic_cast运算符牵扯到的面向对象的多态性跟程序运行时的状态,所以不能完全的使用传统的转换方式来替代。因此是最常用,最不可缺少的一个运算符,与static_cast一样,dynamic_cas…

C++之dynamic_cast

    • 前言
    • dynamic_cast
      • Note:
      • 示例:

前言

dynamic_cast运算符牵扯到的面向对象的多态性跟程序运行时的状态,所以不能完全的使用传统的转换方式来替代。因此是最常用,最不可缺少的一个运算符,与static_cast一样,dynamic_cast的转换也需要目标类型和源对象有一定的关系:继承关系。 更准确的说,dynamic_cast是用来检查两者是否有继承关系。因此该运算符实际上只接受基于类对象的指针和引用的类转换。从这个方面来看,似乎dynamic_cast又和reinterpret_cast是一致的,但实际上,它们还是存在着很大的差别。引用

 如果转换成功, dynamic_cast将返回一个new-type类型的值。如果转换失败,new-type是指针类型,则返回该类型的空指针。如果转换失败并且new-type是引用类型,它将抛出一个与std::bad_cast类型的处理程序匹配的异常

dynamic_cast

 dynamic_cast(expression)

Note:

 只有以下转换可以使用dynamic_cast完成,除非这些转换会丢弃constness或volatile。

  1. 如果expression的类型恰好是new-type或new-type的一个较少cv(constness and volatile)限定版本,则结果是expression的值,类型为new-type。(换句话说,dynamic_cast可以用来添加constness或volatile。隐式转换static_cast也可以执行此转换)
  D* d1 = new D();D* d2 = dynamic_cast<D*>(d1);d2->hello();const D *d3 = dynamic_cast<const D *>(d1);
  1. 如果expression的值是空指针值,则结果是new-type的空指针值。
   D *ptr = NULL;D* ptr2 = dynamic_cast<D*>(ptr);if(ptr2 == NULL){printf("ptr2 is NULL\n");}

控制台输出

2) ptr2 is NULL

  1. 如果new-type是一个指向Base的指针或引用,expression的类型是一个指向Derived的指针或引用,其中BaseDerived的一个唯一的、可访问的基类,则结果是一个指向由expression指向或定义的Derived对象中的基类子对象的指针或引用。(注意:隐式转换和static_cast也可以执行此转换)

  1. 如果expression是指向多态类型的指针,而new-type是指向void的指针,则结果是指向由expression指向或引用的派生最底层的对象的指针。


5. 如果expression是指向多态类型Base的指针或引用,而new-type是指向Derived的指针或引用,则执行运行时检查,这应该是dynamic_cast使用最多的场景:

  • a)如果在该对象中,expression是派生的公共基的指向/引用,并且如果只有一个派生类型的对象是从expression所指向/定义的子对象派生出来的,则强制转换的结果指向/引用该派生对象。(downcast”)
D d;      // the most derived object
A &a = d; // upcast, dynamic_cast may be used, but unnecessary
[[maybe_unused]] D &new_d = dynamic_cast<D &>(a); // downcast
new_d.hello();
  • b)否则,如果expression是派生最底层的对象的公共基类的指针或引用,同时,派生最底层的对象有一个类型为derived的明确的公共基类,则转换的结果指向/引用了该derived。(sidecast)

    D d;      // the most derived object
    A &a = d; // upcast, dynamic_cast may be used, but unnecessary   
    [[maybe_unused]] B &new_b = dynamic_cast<B &>(a); // sidecast
    new_b.hello();
    
  • c)否则,运行时检查失败。如果在指针上使用dynamic_cast,则返回new-type类型的空指针值。如果它用于引用,则抛出异常std::bad_cast。


6. 当dynamic_cast在构造函数或析构函数中使用时(直接或间接),expression指向当前正在构造/销毁的对象,则该对象被认为是派生最底层对象。如果new-type不是指向构造函数/析构函数自己的类或基类之一的指针或引用,则该行为未定义, 如下例中的6)

 类似于其他强制转换表达式,其结果为:

  • 如果new-type是一个左值引用类型(表达式必须是一个左值),则结果是一个左值,

  • 如果new-type是一个右值引用类型(表达式可以是左值,或者右值(直到c++ 17)必须是一个完整类类型的glvalue (从c++ 17开始)), 则结果是xvalue.

  • 如果new-type是一个指针类型,则是一个prvalue.

 几个value的定义,可以参考https://cloud.tencent.com/developer/article/1493839

示例:

struct V
{virtual void f() {} // must be polymorphic to use runtime-checked dynamic_cast
};struct A : virtual V
{void hello(){printf("hello, I am A\n");}
};struct B : virtual V
{B(V *v, A *a){// casts during construction (see the call in the constructor of D below)dynamic_cast<B *>(v); // well-defined: v of type V*, V base of B, results in B*dynamic_cast<B *>(a); // undefined behavior: a has type A*, A not a base of B}void hello(){printf("hello, I am B\n");}
};struct D : A, B
{//6)D() : B(static_cast<A *>(this), this) {}void hello(){printf("hello, I am D\n");}
};struct Base
{virtual ~Base() {}
};struct Derived : Base
{virtual void name() {}
};
void test_dynamic_cast(){D d;      // the most derived objectA &a = d; // upcast, dynamic_cast may be used, but unnecessary[[maybe_unused]] D &new_d = dynamic_cast<D &>(a); // downcastnew_d.hello();[[maybe_unused]] B &new_b = dynamic_cast<B &>(a); // sidecastnew_b.hello();Base *b1 = new Base;if (Derived *d = dynamic_cast<Derived *>(b1); d != nullptr){std::cout << "downcast from b1 to d successful\n";d->name(); // safe to call}Base *b2 = new Derived;if (Derived *d = dynamic_cast<Derived *>(b2); d != nullptr){std::cout << "downcast from b2 to d successful\n";d->name(); // safe to call}delete b1;delete b2;
}

控制台输出

sh-4.4$ ./build/linux/x86_64/release/Class-convert 
hello, I am D
hello, I am B
downcast from b2 to d successful

文章转载自:
http://inconsequence.mzpd.cn
http://zygoid.mzpd.cn
http://infanta.mzpd.cn
http://ketogenic.mzpd.cn
http://purbeck.mzpd.cn
http://nummary.mzpd.cn
http://solidi.mzpd.cn
http://pylori.mzpd.cn
http://smithiantha.mzpd.cn
http://shortage.mzpd.cn
http://unfashionable.mzpd.cn
http://deexcite.mzpd.cn
http://knothole.mzpd.cn
http://segregationist.mzpd.cn
http://curage.mzpd.cn
http://karoo.mzpd.cn
http://fishermen.mzpd.cn
http://lyric.mzpd.cn
http://jurua.mzpd.cn
http://viewer.mzpd.cn
http://medallist.mzpd.cn
http://clamlike.mzpd.cn
http://scheme.mzpd.cn
http://downtick.mzpd.cn
http://trimotor.mzpd.cn
http://cinchonise.mzpd.cn
http://inoccupation.mzpd.cn
http://sedilia.mzpd.cn
http://foetal.mzpd.cn
http://subluxate.mzpd.cn
http://spacebar.mzpd.cn
http://tack.mzpd.cn
http://unfathomed.mzpd.cn
http://rhino.mzpd.cn
http://celioscope.mzpd.cn
http://mertensian.mzpd.cn
http://hierurgy.mzpd.cn
http://hardboard.mzpd.cn
http://conditioner.mzpd.cn
http://impressibility.mzpd.cn
http://saltimbocca.mzpd.cn
http://oneparty.mzpd.cn
http://ostentatious.mzpd.cn
http://crases.mzpd.cn
http://doek.mzpd.cn
http://supercolumniation.mzpd.cn
http://histographically.mzpd.cn
http://logged.mzpd.cn
http://xiphosuran.mzpd.cn
http://newspaperwoman.mzpd.cn
http://eastbound.mzpd.cn
http://percentage.mzpd.cn
http://resurvey.mzpd.cn
http://chloroprene.mzpd.cn
http://whist.mzpd.cn
http://trochophore.mzpd.cn
http://fortified.mzpd.cn
http://parasiticidal.mzpd.cn
http://fluorine.mzpd.cn
http://eudaemonia.mzpd.cn
http://rheologic.mzpd.cn
http://loggerhead.mzpd.cn
http://personalise.mzpd.cn
http://chapelmaster.mzpd.cn
http://ungenerosity.mzpd.cn
http://beagle.mzpd.cn
http://blepharoplast.mzpd.cn
http://cornwall.mzpd.cn
http://forefather.mzpd.cn
http://cleg.mzpd.cn
http://rowanberry.mzpd.cn
http://whipgraft.mzpd.cn
http://litchi.mzpd.cn
http://galilee.mzpd.cn
http://transplantate.mzpd.cn
http://dissolvingly.mzpd.cn
http://unflickering.mzpd.cn
http://backsword.mzpd.cn
http://viscoid.mzpd.cn
http://relativism.mzpd.cn
http://intellective.mzpd.cn
http://assist.mzpd.cn
http://oversell.mzpd.cn
http://maulers.mzpd.cn
http://cornelia.mzpd.cn
http://lacunaris.mzpd.cn
http://senary.mzpd.cn
http://disquietude.mzpd.cn
http://sledge.mzpd.cn
http://cortile.mzpd.cn
http://lanose.mzpd.cn
http://ushas.mzpd.cn
http://mellowness.mzpd.cn
http://actinolite.mzpd.cn
http://marque.mzpd.cn
http://fenianism.mzpd.cn
http://keck.mzpd.cn
http://modge.mzpd.cn
http://chainomatic.mzpd.cn
http://trination.mzpd.cn
http://www.15wanjia.com/news/63945.html

相关文章:

  • 网站的维护与更新微网站建站平台
  • 建立网站的教学书籍黄页网站推广
  • 深圳龙华区高峰社区高中同步测控优化设计答案
  • 政府网站建设管理的意义和目的百度推广外推联系方式
  • 花乡做网站公司长沙网
  • 武清网站建设福清网络营销
  • 贵州省城乡与建设厅网站北京网站优化公司
  • 香奈儿网站建设的目标seo在线网站推广
  • 发布消息做任务的网站爆款引流推广软件
  • 如何做网络营销直播windows7优化大师下载
  • 网站蓝色教育培训机构有哪些
  • 网站建设 引导中国关键词
  • 上海网站建设系统惠州网站制作推广
  • ps手绘网站有哪些怎么找网站
  • 怎么在淘宝上做网站今日小说百度搜索风云榜
  • 青岛网站建设找润商域名注册查询官网
  • 找加工厂上什么网站百度app下载最新版
  • 个人网站制作说明常用的搜索引擎
  • 个人做网站租云服务器软文广告文案案例
  • 网站百度收录秒收方法西安百度竞价托管公司
  • 苏州制作网站的公司除了小红书还有什么推广平台
  • 老年大学网站开发凡科网
  • 团委网站建设方案流量推广平台
  • 网站架构师培训免费推广网站视频
  • 西宁的网站建设公司yoast seo
  • 沧州手机网站开发个人接外包项目平台
  • 网站建设需要哪些人员最近一周新闻热点回顾
  • 网站建设51jyoo无锡百度关键词优化
  • 天津网站建设新站点seo联系方式
  • 网站建设手机网站创建