C++类型铸造

C++类型铸造,c++,casting,C++,Casting,请参阅以下代码: void simple_dynamic_casts( ) { AB ab; B* bp = (B*)&ab; // cast needed to break protection A* ap = &ab; // public derivation, no cast needed AB& abr = dynamic_cast<AB&>(*bp); // succeeds ap = dyn

请参阅以下代码:

void simple_dynamic_casts( )
{
  AB  ab;

  B*  bp  = (B*)&ab;  // cast needed to break protection
  A*  ap  = &ab;      // public derivation, no cast needed

  AB& abr = dynamic_cast<AB&>(*bp);  // succeeds

  ap = dynamic_cast<A*>(bp);         assert( ap != NULL );
  bp = dynamic_cast<B*>(ap);         assert( bp == NULL );
  ap = dynamic_cast<A*>(&abr);       assert( ap != NULL );
  bp = dynamic_cast<B*>(&abr);       assert( bp == NULL );
}

为什么代码在这里使用动态强制转换。我没有尝试编译此代码。

是。指向类的指针始终可以隐式转换为指向公共基类的指针;在本例中,您将从AB*转换为A*。允许动态_强制转换,但不是必需的

这与第二次转换A*ap=&ab;没有什么不同


代码使用动态转换来说明其工作原理。

是。指向类的指针始终可以隐式转换为指向公共基类的指针;在本例中,您将从AB*转换为A*。允许动态_强制转换,但不是必需的

这与第二次转换A*ap=&ab;没有什么不同

该代码使用一个动态的_cast来说明它是如何工作的

为什么代码在这里使用动态强制转换

dynamic_cast操作符允许您检查转换在运行时是否有效。如果不是,它将返回null,因此断言调用

这样行吗

ap = &abr;
试试看……:

为什么代码在这里使用动态强制转换

dynamic_cast操作符允许您检查转换在运行时是否有效。如果不是,它将返回null,因此断言调用

这样行吗

ap = &abr;
试试看……:

他们使用动态投影来显示它的功能。这就是你为什么要问的答案

否则,该网页上给出的解释是不正确的。您试图使用的资源要么严重过时,要么与某些特定的、低质量的编译器绑定。新兴C++标准的词汇…在这一页的顶部是一个死赠品。C++标准在11年前就变成了现实。这意味着网站不是一个很好的C++资源,特别是动态的,如果你想找的话。 下面是他们的类定义

class A          { public: virtual void f( ); };
class B          { public: virtual void g( ); };
class AB :       public virtual A, private B { };
演员阵容

AB& abr = dynamic_cast<AB&>(*bp); // they say: succeeds
甚至不会编译,因为破坏保护的非法上传在编译时会被拒绝,即使是动态上传,也会被拒绝,即代码格式错误。请注意,在这种情况下,dynamic_cast没有任何特殊功能。对于向上投射,动态投射等同于静态投射或根本不投射。上面的强制转换将不会编译,因为B是私有基。作者似乎错误地认为,在这种情况下,dynamic_cast应该返回空指针

至于ap=&abr-是的,它会起作用。只要a是AB的公共基础,它就没有问题。

他们使用动态投射来展示它的功能。这就是你为什么要问的答案

否则,该网页上给出的解释是不正确的。您试图使用的资源要么严重过时,要么与某些特定的、低质量的编译器绑定。新兴C++标准的词汇…在这一页的顶部是一个死赠品。C++标准在11年前就变成了现实。这意味着网站不是一个很好的C++资源,特别是动态的,如果你想找的话。 下面是他们的类定义

class A          { public: virtual void f( ); };
class B          { public: virtual void g( ); };
class AB :       public virtual A, private B { };
演员阵容

AB& abr = dynamic_cast<AB&>(*bp); // they say: succeeds
甚至不会编译,因为破坏保护的非法上传在编译时会被拒绝,即使是动态上传,也会被拒绝,即代码格式错误。请注意,在这种情况下,dynamic_cast没有任何特殊功能。对于向上投射,动态投射等同于静态投射或根本不投射。上面的强制转换将不会编译,因为B是私有基。作者似乎错误地认为,在这种情况下,dynamic_cast应该返回空指针


至于ap=&abr-是的,它会起作用。只要a是AB的公共基,它就没有问题。

那么bp=dynamic\u castap是编译的。但是断言失败了。。。该演员不应包括在内。这是一个交叉投射,而不是向上投射。我修好了。谢谢。bp=dynamic\u castap确实可以编译。但是断言失败了。。。该演员不应包括在内。这是一个交叉投射,而不是向上投射。我修好了。非常感谢。