使用dynamic_cast强制转换const的类

13

我想进行强制类型转换:

class Base 
{
public:
    virtual ~Base(){};
};
class Der : public Base {};

int main()
{
    const Base* base = new Der;
    Der* der = dynamic_cast<Der*>(base); // Error

    return 0;
}

我该怎么办? 我试着写成这样:const Der* der = dynamic_cast<Der*>(base); 以保持const,但是这行代码不起作用。

2个回答

28

试试这个:

const Der* der = dynamic_cast<const Der*>(base);

dynamic_cast不能去除const限定符。你可以使用const_cast单独转换掉const,但在大多数情况下这通常是不好的做法。此外,如果你发现自己在使用dynamic_cast,那通常意味着有更好的方法来完成你想做的事情。它并不总是错误的,但应将其视为一个警告信号,表示你正在用一种困难的方式进行操作。


1
你需要两次使用const——一次在赋值给变量的类型中,另一次在dynamic_cast中。在你尝试的例子中,你只有第一个。 - Eclipse
为什么我应该保留虚拟~Base(){};以避免dynamic_cast给我错误? - okami
@okami:如果您实际上不需要虚拟析构函数,可以将其替换为任何虚拟函数。请参见此链接:http://publib.boulder.ibm.com/infocenter/compbgpl/v9v111/index.jsp?topic=/com.ibm.xlcpp9.bg.doc/language_ref/keyword_dynamic_cast.htm “dynamic_cast运算符使用从多态类生成的运行时类型信息”。此外,关于是否应保留虚拟析构函数,请参见此链接:http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.7。 - Merlyn Morgan-Graham

4
const Der* der1 = dynamic_cast<const Der*>(base); 

Der* der2 = dynamic_cast<Der*>(const_cast<Base*>(base));

虽然以上两种铸造方式都可以使用,但应避免使用第二种。


2
为什么第二个应该被避免? - user3742309

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接