2010-08-05 101 views
3

无论何时我尝试运行此代码,此代码都会返回一个错误。有人可以帮帮我吗。动态铸造问题

struct m 
{ 
    virtual int s() 
    { 
     return 1; 
    } 
}; 

struct n : public m 
{ 
    int s() 
    { 
     return 2; 
    } 
}; 

int o() 
{ 
    n* p=new m; 
    m* q=dynamic_cast<p>; 
    return q->s(); 
} 
+2

你应该发布你在运行代码时得到的错误。 – 2010-08-05 17:49:45

+0

如果您想成为下一个卡拉什尼科夫分解员工受害者nr 1,请编写此代码。 为什么地球上您需要dynamic_cast? – jpinto3912 2010-08-05 17:54:48

+0

您当然不需要'dynamic_cast'来调用虚函数。这是虚拟功能的重点。并且在取消引用指针之前总是检查转换是否成功。 – 2010-08-05 18:14:40

回答

7

这些C++投运营商应作为

dynamic_cast<newType>(variable) 

在你的情况,

m* q = dynamic_cast<m*>(p); 

BTW,你混乱的mn的作用? n* p = new m是语法错误,因为基类实例不能隐式转换为派生类实例。实际上,基地→派生的你实际需要dynamic_cast的情况,而不是相反(不需要施法)。

此外,请考虑给对象赋予有意义的名称。

2

下次请告诉我们错误是什么!

我想你是说有一个编译错误,因为你没有使用dynamic_cast权利?你可能是想说

m* q=dynamic_cast<m *>(p); 

一般来说,dynamic_cast是魔鬼。大多数实现非常慢,可能会进行基于字符串的类名检查。除非你确实需要使用dynamic_cast,否则请使用其他可用的方法(如static_cast)。

+0

http://www.boost.org/doc/libs/1_43_0/libs/conversion/cast.htm是两个阵容中最好的.. – smerlin 2010-08-05 17:55:04

0

两个问题,首先你不能在m的第一行中分配m并将其称为n。你在dynamic_cast中有一个合成错误。它是dynamic_cast<new type>(some var)