C++ 动态强制转换返回null

C++ 动态强制转换返回null,c++,polymorphism,dynamic-cast,C++,Polymorphism,Dynamic Cast,我面临一个问题,动态_cast返回null。我试图从一张卡片*向下转换到GCard*,其中GCard是一个派生的卡片类(它是多态的) 下面是失败的代码示例。如果有人能告诉我这次失败的原因,我将不胜感激 class Card { public: Card(Rank, Suit); virtual ~Card(); void SetSelected(bool selected); Suit mSuit; Rank mRank; bool mSelected; }

我面临一个问题,动态_cast返回null。我试图从一张卡片*向下转换到GCard*,其中GCard是一个派生的卡片类(它是多态的)

下面是失败的代码示例。如果有人能告诉我这次失败的原因,我将不胜感激

class Card
{
public:
   Card(Rank, Suit);
   virtual ~Card();
   void SetSelected(bool selected);

   Suit mSuit;
   Rank mRank;
   bool mSelected;
};

class GCard : public Card
{
public:
   GCard(Rank, Suit);
   virtual ~GCard();

   void LoadTexture();
   void SetDepth(int);

   sf::Sprite mSprite;
   int mDepth;
private:
  sf::Texture mTexture;
};

int main(void)
{
   Card c(Two, clubs);
   Card* pC = &c;

   GCard* pG = dynamic_cast<GCard *>(pC);
   if (!pG)
   {
      cout << "Dynamic cast returned null"; // This line is being executed
   }
   return 0;
}
类卡
{
公众:
卡片(等级、套装);
虚拟卡();
选择无效设置(选择布尔值);
西服;
秩mRank;
选择布尔值;
};
信用卡类别:公共卡
{
公众:
GCard(等级、诉讼);
虚拟的~GCard();
void LoadTexture();
空隙深度(int);
sf::雪碧mSprite;
int-mDepth;
私人:
sf:纹理纹理;
};
内部主(空)
{
c卡(两个,俱乐部);
卡*pC=&c;
GCard*pG=动态铸造(pC);
如果(!pG)
{

cout
dynamic\u cast
正在返回
nullptr
,因为您的对象显然不是
GCard
。dynamic cast不是一种神秘的神奇机制,它可以将对象转换为不属于的对象。它所做的只是允许您在对象已读取时将其用作子类类型y是那种类型的

以下操作将按照您的预期进行:

int main(void)
{
   GCard c(Two, clubs); //Note the key change, the object **IS-A** GCard
   Card* pC = &c;

   GCard* pG = dynamic_cast<GCard *>(pC);
   if (!pG)
   {
      cout << "Dynamic cast returned null"; // This line would no longer be executed
   }
   return 0;
}
int main(无效)
{
GCard c(两个,梅花);//注意键的变化,对象**是-A**GCard
卡*pC=&c;
GCard*pG=动态铸造(pC);
如果(!pG)
{

cout
c
被实例化为
Card
。你为什么希望这里有不同的东西呢?谢谢你,克雷格。我完全错过了。我知道这个对象首先应该是一个GCard。