C++ C++;动态浇铸 A类 { }; B类:公共A { }; int main() { A A; B B; A*ap=&b; B*bp=动态投影(ap); 如果(bp!=NULL) cout

C++ C++;动态浇铸 A类 { }; B类:公共A { }; int main() { A A; B B; A*ap=&b; B*bp=动态投影(ap); 如果(bp!=NULL) cout,c++,virtual,dynamic-cast,C++,Virtual,Dynamic Cast,输出内容大致如下: 错误xxxx:dynamic_cast的参数无效。类为非多态类型 这些类需要是多态的,因为这是dynamic\u cast的规范。在内部,dynamic\u cast检查虚拟表指针,但这是一个实现细节 在这种情况下,您可以使用static\u cast。dynamic\u cast的工作方式与static\u cast不同。static\u cast的结果始终是指针。但是,如果强制转换不正确(指向给定指针最初不是的类型),则转换的结果是未定义的;指针不一定有效。因此,使用st

输出内容大致如下:

错误xxxx:dynamic_cast的参数无效。类为非多态类型

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


在这种情况下,您可以使用
static\u cast

dynamic\u cast
的工作方式与
static\u cast
不同。
static\u cast
的结果始终是指针。但是,如果强制转换不正确(指向给定指针最初不是的类型),则转换的结果是未定义的;指针不一定有效。因此,使用
static_cast
转换到派生类时存在一定程度的不确定性;没有任何机制可以防止您转换到错误的对象


dynamic_cast
如果转换正确,将返回有效指针;如果转换不正确,将返回空指针。因此,在所有情况下,结果都是定义良好的。为此,
dynamic_cast
必须是动态的。这意味着它必须对指针执行运行时检查,以查看转换到的类型是否是合法的转换操作绝望

C++禁止对非虚拟类型进行强制转换,因为“按使用付费”原则:没有虚函数的类型通常不是通过其基类传递的类型。没有虚函数的继承主要是关于使用现有实现,而不是专门化函数。即使像虚析构函数这样简单的东西也足够了


进行动态转换所需的机器是非零的。因此,根据“按使用付费”原则,只有那些有用的类才会付费。即:那些虚拟的类。

虚拟的
是多形性的关键。虚拟函数意味着它是“可重写的”通过派生类,否则类之间没有多态性,只有继承。如果类不是多态性的,则不能使用
dynamic\u cast

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;
}