免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2370 | 回复: 9
打印 上一主题 下一主题

[C++] dynamic_cast向下强制的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-13 17:11 |只看该作者 |倒序浏览
#include <iostream>
using namespace std;
class A
{
public:
virtual void sprint()
{
    cout<<"A";
}
A()
{
}

};

class B:  public A
{
public:
B()
{

}

void sprint()
{
    cout<<"B";
}
};
int main() {

    A* a = new A();
    A& a1 = * new A();
    try{
        B* b = dynamic_cast<B *>(a);
        b->sprint();
        //B& b1 = dynamic_cast<B &>(a1);

        //b1.sprint();

    }
    catch(bad_cast){

        cout<<"bad_cast";
    }
    return 0;

上面的代码编译没有问题,但在执行时(用的是cygwin里的g++)
      4 [main] Test 1700 _cygtls::handle_exceptions: Exception: STATUS_ACCESS_VIOLATION
   1006 [main] Test 1700 open_stackdumpfile: Dumping stack trace to Test.exe.stackdump

修改
        //B* b = dynamic_cast<B *>(a);

        //b->sprint();

        B& b1 = dynamic_cast<B &>(a1);
        b1.sprint();

引用的dynamic_cast会出现bad_cast的异常。但是向上强制均没有问题。

dynamic_cast的向下强制,必须使用多态,这点我已经做了,不知道还有其他解释。

[ 本帖最后由 smartvessel 于 2010-1-13 17:17 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2010-01-13 17:14 |只看该作者
向上强制,如下
    B* b = new B();
    B& b1 = * new B();
    try{
        A* a = dynamic_cast<A *>(b);
        a->sprint();
        A& a1 = dynamic_cast<A &>(b1);
        a1.sprint();
    }


程序没有问题

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
3 [报告]
发表于 2010-01-13 17:22 |只看该作者

回复 #1 smartvessel 的帖子

if ( D* d = dynamic_cast<D*>(b) ) {
    d-> ...
}

try {
      D& d = dynamic_cast<D&>(*b);
      d. ...
}

论坛徽章:
0
4 [报告]
发表于 2010-01-13 17:24 |只看该作者
原帖由 OwnWaterloo 于 2010-1-13 17:22 发表
if ( D* d = dynamic_cast(b) ) {
    d-> ...
}

try {
      D& d = dynamic_cast(*b);
      d. ...
}


明白,我想问向下cast的时候,为什么会出现bad_cast的异常?

论坛徽章:
0
5 [报告]
发表于 2010-01-13 17:27 |只看该作者
    A* a = new A();
    if(B* b = dynamic_cast<B *>(a))
    b->sprint();


B* b = dynamic_cast<B *>(a)
为啥返回的空指针?

论坛徽章:
0
6 [报告]
发表于 2010-01-13 17:30 |只看该作者
    A* a = new B();
    A& a1 = * new B();
    if(B* b = dynamic_cast<B *>(a))
    b->sprint();
    try{
        B& b1 = dynamic_cast<B &>(a1);
        b1.sprint();
    }
    catch(bad_cast){

        cout<<"bad_cast";
    }


这样?
    A* a = new B();
    A& a1 = * new B();

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
7 [报告]
发表于 2010-01-13 17:30 |只看该作者

回复 #5 smartvessel 的帖子

语言规定

论坛徽章:
0
8 [报告]
发表于 2010-01-13 17:37 |只看该作者

回复 #7 OwnWaterloo 的帖子

A* a = new B();和A* a = new A();到底啥区别?

难道后者a不可以动态强制为B?因为强制后,结果是NULL,引用强制就直接报异常。

论坛徽章:
0
9 [报告]
发表于 2010-01-13 17:42 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
10 [报告]
发表于 2010-01-14 00:04 |只看该作者

回复 #9 sbdan 的帖子

这位看官,你发这个干吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP