1

テストの勉強中にこの問題に遭遇したため、簡単な説明が必要です。と別のもの
がある 場合: さて、 と を取得した場合、でも可能性があります... したがって、私の主な質問は、両方がそうであるかどうかをどのように確認できるかということです。class Objectclass Point : public Object
Object& O1Object& O2ObjectPoint
PointObject

2 つのクラスを次に示します。

Class Object {
public :
一部の関数
};

クラス ポイント : Public Object {
double x;
ダブルy;
public:
同じ関数の異なる実装
};

x,y にアクセスしたいのですが、それがPoint最初であることを確認する必要があります。

前もって感謝します

4

4 に答える 4

7

dynamic_cast を使用できます

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

の動的型がoであるか、Pointまたはそれから派生している場合、 内のコードはすぐに利用できるif状態で実行されpます (の静的型はoですObject)。

であることがすでにわかっている場合は、Point参照を使用できます

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

これが機能するためには、 に少なくとも 1 つのvirtual関数 (デストラクタのみの場合) が必要Objectです。

于 2013-07-29T20:41:27.693 に答える
3

一般に、これを「知る必要がある」場合は、間違っています。いくつかの例外がありますが、原則として、「使用している」オブジェクトのタイプを知る必要はありません。異なる関数は として宣言する必要があります。これにより、オブジェクトが型オブジェクトである場合に、virtualで何かを実行しているコードがObject関連する関数を呼び出すことができます。PointPoint

andにアクセスしたい場合は、 xandyで実行する必要があるアクションを実行する仮想関数を介して間接的に行う必要がxありyます。本当に触れる必要があり、x(yへの参照またはポインター) しか持っていない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 に答える