【问题标题】:Determine type of an inherting object in c++在 C++ 中确定继承对象的类型
【发布时间】:2015-01-06 13:42:54
【问题描述】:

我有这两个课程。

class ChessPiece
{
public:
    ChessPiece();
    virtual bool move() = 0;

};

class Bishop: public ChessPiece
{
public:
    Bishop();
    bool move();
};

在我这样创建 ChessPiece 之后,我正在尝试确定它的类型

ChessPiece* foo = new Bishop()

我正在尝试获取 foo (Bishop) 而不是 ChessPiece 的类型。

谢谢

【问题讨论】:

  • 如果基类没有虚函数,则不能这样做。
  • 确定它的目的是什么?你到底想达到什么目的?
  • 试图确定某个棋子是国王还是别的什么
  • 很可能有更好的解决方案,它不涉及确定类型。如果您向我们提供更多信息,我们会尽力提供帮助。
  • 问你的对象是什么是错误的。你应该告诉它一些事情。 move 就是一个很好的例子。无需尝试确定这种类型的碎片如何移动,您只需说出piece.move(),虚函数就会做正确的事情。

标签: c++ oop object


【解决方案1】:

嗯,有一些方法可以做到这一点,看看动态转换:

class A
{
public:
   virtual void Foo() = 0;
};

class B : public A
{
public:
   void Foo() { }
};

void Test()
{
   A* bar = new B();
   if (B* test = dynamic_cast<B*>(bar))
   {
      // use test here
   }
   delete bar;
}

或者,您可以在定义棋子 ID 的棋子类中存储一个枚举。

【讨论】:

    【解决方案2】:

    解决问题的方法示例:

    enum PieceType
    {
        King,
        Queen,
        Rook,
        Bishop,
        Knight,
        Pawn
    };
    
    class ChessPiece
    {
    public:
        ChessPiece();
        virtual ~ChessPiece();
        virtual bool move() = 0;
        virtual PieceType GetType() const = 0;
    };
    
    class Bishop : public ChessPiece
    {
    public:
        Bishop();
        virtual ~Bishop();
        virtual bool move();
        virtual PieceType GetType() const { return Bishop; }
    };
    

    然后使用 ChessPiece::GetType() 来确定这是什么棋子。

    【讨论】:

      【解决方案3】:

      您可以使用以下代码。

      ChessPiece obj; 
      Bishop* pObj = dynamic_cast<Bishop*>(&obj);//Change to Bishop,return NULL if failed.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-12
        • 2018-09-30
        • 2018-02-24
        • 1970-01-01
        • 1970-01-01
        • 2021-12-27
        • 2021-07-05
        • 2020-08-29
        相关资源
        最近更新 更多