2012-08-06 60 views
-1
class A 
{ 
}; 

class B:public A 
{ 
}; 
int main() 
{ 
    A a; 
    B b; 
    A *ap = &b; 
    B *bp = dynamic_cast<B*>(ap); 
    if(bp!= NULL) 
     cout<<"Pass"<<endl; 
    else 
     cout<<"Fail"<<endl; 
    return 0; 
} 

为什么,如果你想要做一个动态转换的A类是虚拟的?C++的dynamic_cast

回答

1

输出将是沿着线的东西:

错误XXXX:无效的参数dynamic_cast。类是非多态的类型。

这些类需要多态,因为这是dynamic_cast的规范。在内部,dynamic_cast检查虚拟表指针,但这是一个实现细节。

在这种情况下,您可以使用static_cast

6

dynamic_caststatic_cast的作用不同。 static_cast的结果总是一个指针。但是,如果转换不正确(对于给定指针最初不是的类型),则转换的结果是未定义的;指针不一定有效。因此,使用static_cast转换为派生类时存在一定程度的不确定性;没有任何机制可以阻止你投掷错误的东西。

dynamic_cast如果转换正确,将返回一个有效的指针,如果转换正确则返回一个空指针。因此,所有情况下的结果都是明确的。为了做到这一点,dynamic_cast必须是动态。这意味着它必须对指针进行运行时检查,以查看被转换为的类型是否是合法的转换操作。

由于“支付你使用的东西”的原则,C++禁止非虚拟类型转换:没有虚函数的类型通常不是你的基类传递的类型。没有虚拟的继承主要是使用现有的实现,而不是专门的功能。即使像虚拟析构函数一样简单就足够了。

dynamic_cast所需的机器是非零的。所以,根据“为你使用什么付费”的原则,只有那些对有用的才会付钱。 IE:那些虚拟的类。

0

virtual是polymorphysm的关键。虚函数意味着它是由派生类“重写”的,否则在类之间没有多态,只有继承。如果这些类不是多态的,则不能使用dynamic_cast