1

备考时遇到这个问题,请大家简单解释一下。
如果我有一个class Object和另一个:class Point : public Object
现在,如果我得到Object& O1and Object& O2,但Object也可以Point......
所以我的主要问题是如何检查它们是否都是Point因为我需要访问一个Object没有的字段

这是两个类:

类对象{
公共:
一些功能
};

类点:公共对象 {
double x;
双 y;
public:
相同的功能不同的实现
};

我想访问 x,y 但我需要确保它是Point第一个。

提前致谢

4

4 回答 4

7

您可以使用 dynamic_cast

Object &o = ...;
if(Point *p = dynamic_cast<Point*>(&o)) {
  // ...
}

如果 的动态类型o是 aPoint或从它派生,则 中的代码if将在随时可用的情况下执行p(静态类型ois Object)。

如果您已经知道它是 a Point,则可以使用引用

Point &p = dynamic_cast<Point&>(o);
// ...

为此,必须至少有一个virtual函数(如果只有析构函数)在Object.

于 2013-07-29T20:41:27.693 回答
3

一般来说,如果你“需要”知道这一点,你就做错了。有一些例外,但通常,您不需要知道您正在“使用”哪种类型的对象。您的不同函数应声明为virtual,以便使用 an 执行某些操作的代码可以在对象是类型对象Object时调用相关函数。PointPoint

如果你想访问xand y,你应该通过一个虚拟函数间接地做到这一点,该函数执行需要对xand执行的任何操作y。如果您真的需要触摸x并且y只有(引用或指针) an Object,那么您就处于错误的水平。

于 2013-07-29T20:43:39.693 回答
1

您可以依赖 C++ 标准库提供的类型信息。以下示例摘自 cppreference.com:

#include <iostream>
#include <typeinfo>
#include <string>
#include <utility>

class person
{
  public:

   person(std::string&& n) : _name(n) {}
   virtual const std::string& name() const{ return _name; }

  private:

    std::string _name;
};

class employee : public person
{
   public:

     employee(std::string&& n, std::string&& p) :
         person(std::move(n)), _profession(std::move(p)) {}

     const std::string& profession() const { return _profession; }

   private:

     std::string _profession;
};

void somefunc(const person& p)
{
   if(typeid(employee) == typeid(p))
   {
      std::cout << p.name() << " is an employee ";
      auto& emp = dynamic_cast<const employee&>(p);
      std::cout << "who works in " << emp.profession() << '\n';
   }
}

int main()
{
   employee paul("Paul","Economics");
   somefunc(paul);
}
于 2013-07-29T20:47:53.020 回答
0

它可能很草率,但如果你有一个对象的指针或引用,你总是可以调用一个 dynamic_cast。如果指针作为 nullptr 返回,那么您知道您的对象不是所需对象的派生类。

class CBase { 
      virtual void dummy(){}
};
class CDerived: public CBase {
    int a;
};

int main () {
  try {
    CBase * pba = new CDerived;
    CBase * pbb = new CBase;
    CDerived * pd;

    pd = dynamic_cast<CDerived*>(pba);
    if (pd==0) cout << "Null pointer on first type-cast" << endl;

    pd = dynamic_cast<CDerived*>(pbb);
    if (pd==0) cout << "Null pointer on second type-cast" << endl;

  } catch (exception& e) {cout << "Exception: " << e.what();}
  return 0;
}
于 2013-07-29T20:42:12.320 回答