sp dynamic cast_cast怎么使用啊~求教!!!

/*这是从网上摘下的例子,主要讲述了 dynamic_cast&& 的使用方法。*/&
作用:将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理,&
&&&&&& 即会作一定的判断。&
&&&&&& 对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针;&
&&&&&& 对引用进行dynamic_cast,失败抛出一个异常,成功返回正常cast后的对象引用。&
注意:dynamic_cast在将父类cast到子类时,父类必须要有虚函数。例如在下面的代码中将CBasic类中的test函数不定义成&
&&&&&& virtual时,编译器会报错:error C2683: dynamic_cast : “CBasic”不是多态类型&
对编译器的要求:&
&&&&&& dynamic_cast&& 会用到RTTI技术,因此需要启动“运行时类型信息”这一选项,而在VC.net 2003中默认是关闭的。&
&&&&&& 所以需要人为的启动这一选项。否则编译器会报下面的警告:&
&&&&&&&& warning C4541: “dynamic_cast”用在了带 /GR- 的多态类型“CBasic”上;&
&&&&&& 可能导致不可预知的行为从而导致程序在运行时发生异常。&
该设置在 Project-&Setting中 C/C++ -& C++ Language中设置。&
#include &iostream&&
class CBasic&
&&&& virtual int test(){return 0;} // 一定要是 virtual&
class CDerived : public CBasic&
&&&& virtual int test(){&&& return 1;}&
int main()&
&&&& CBasic&&&&&&& cB&
&&&& CDerived&&& cD&
&&&& CBasic * pB1 = new CB&
&&&& CBasic * pB2 = new CD&
&&&& //dynamic cast failed, so pD1 is null.&
&&&& CDerived * pD1 = dynamic_cast&CDerived * & (pB1);&&&&
&&&&&&&&&&&&&&&&&&
&&&& //dynamic cast succeeded, so pD2 points to& CDerived object&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&& CDerived * pD2 = dynamic_cast&CDerived * & (pB2);&&&&
&&&& //dynamci cast failed, so throw an exception.&&&&&&&&&&&&&
//&&& CDerived & rD1 = dynamic_cast&CDerived && (*pB1);&&&&
//dynamic cast succeeded, so rD2 references to CDerived object.&
&&&& CDerived & rD2 = dynamic_cast&CDerived && (*pB2);&&&&
&&&& return 0;&
转自论坛的文章,地址,使用中发现红字部分以前没注意过
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:107756次
积分:2502
积分:2502
排名:第11319名
原创:135篇
转载:64篇
评论:13条
(2)(1)(1)(8)(11)(8)(2)(4)(1)(6)(9)(6)(17)(31)(27)(9)(17)(25)(14)dynamic_cast的使用条件
今天从学长那里听来一道腾讯的面试题,问的是C++中的dynamic_cast在什么情况下是错误的?我认为这个问题的更好的描述是dynamic_cast的使用条件是什么?
C++提供了两种方式来支持RTTI,dynamic_cast是其中一种,另一种是typeid()。表面上看,dynamic_cast有两种形式:
Base *pBase = new Base();
Derived *pDerived = dynamic_cast pB
Base refBase = Base();
Derived &refDerived = dynamic_cast refBase
即dynamic_cast用于将基类的引用或指针转化为派生类的引用或指针。但使用条件是:1、基类的指针或引用确实绑定到派生类的对象上;2、只有当基类至少含有一个虚函数的时候才能使用dynamic_cast。原因是RTTI机制依赖于虚函数表(inside C++ object model第一章给出了解释),而dynamic_cast是RTTI的一种,所以必须要有虚函数表的支持,也就是要虚类中至少有一个虚函数。
那么,dynamic_cast有什么好处呢?
我们知道,基类的指针即使指向的是派生类的对象,但通过基类的指针也只能访问到基类中包含的public成员,那如果想要访问派生类中新增的public成员呢?这就需要将基类的的指针动态类型转化为派生类的指针。见以下代码:
class base{
base(int x):a(x){ }
virtual void fcn(){ }
//要有虚函数
class derived:public base{
derived(int x,int y):base(x),b(y){ }
int main(){
base *pbase = new derived(100, 200);
cout<<"derived"<<
cout<<"derived"<<
cout <a <<
cout<<"base"<<
运行结果如下:
《C&#43;&#43; primer》第5版P731上给出了以下代码框架:
if(Derived *dp = dynamic_cast(bp)){
//使用bp指向的Derived对象
//使用bp指向的Base对象
在vs和gcc下测试过:如果bp指向的不是派生类的对象而是基类的对象的话,那么两种编译器下都不能通过编译!!!这样的运行时动态类型判断也就没有意义了。这种写法&#20540;得商榷!
如果是引用的话,当转化不成功时会抛出std::bad_cast异常,详见《C&#43;&#43; primer》第5版P731。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'c++ dynamic_cast与static_cast使用方法示例_C++,C语言_ThinkSAAS
c++ dynamic_cast与static_cast使用方法示例
c++ dynamic_cast与static_cast使用方法示例
首先dynamic_cast: 代码如下:#include &iostream&class A{
virtual ~A(){} //使用dynamic_cast时,必要!};class B:public A{
void foo(){
cout&&"B: "&&m_b&&
int m_b;};int main(){
A *a=new B();
B *b=dynamic_cast&B*&(a);
return 0;}上面没有virtual ~A(){},编译时会报错:(source type is not polymorphic)。static_cast: 代码如下:#include &iostream&class A{
A():m_a(32){}
void foo(){
cout&&"A: "&&m_a&&
void setA(int a){
int m_a;};class B:public A{
void foo(){
cout&&"B: "&&m_b&&
int m_b;};int main(){
A *a=new B();
B *b=static_cast&B*&(a);
A *aa=static_cast&A*&(b);
aa-&foo();
return 0;}打印a、b、aa地址,可知地址一样。
PHP开发框架
开发工具/编程工具
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
让ThinkSAAS更好,把建议拿来。
开发客服微信dynamic_cast的用法.
up蔷薇BI22ON01
动态转换.dynaimic_cast();
为您推荐:
其他类似问题
扫描下载二维码

我要回帖

更多关于 sp dynamic cast 的文章

 

随机推荐