0

C ++の基本クラスへのポインターがある場合A、そのポインターが派生クラスへのポインターであることをコードでどのように判断できますBC

4

3 に答える 3

6

基本クラスAがポリモーフィックである(つまり、少なくとも1つの仮想関数がある)と仮定すると、を使用できますdynamic_cast。与えられたA* ap;

if (B* bp = dynamic_cast<B*>(ap)) {
    // the object is a B
}
else if (C* cp = dynamic_cast<C*>(ap)) {
    // the object is a C
}
于 2010-12-13T07:05:02.473 に答える
2

通常、次のことを知る必要はありません。

struct A {
    virtual int generate_foo() = 0;
};

struct B : A {
    int generate_foo() { return 42; }
};

struct C : A {
    i_;
    C(int i) : i_(i) { }
    int generate_foo() { return i_++; }
};

あなたがあなたを持っているA*なら、(1)それがgenerate_foo()メソッドを持っていることを知っていて、(2)generate_foo()あなたが実際に持っているどんなオブジェクトに対しても適切なfooを生成することを知っています。一般に、それで十分であり、いつ持っているかを追跡できるはずA*です。

哲学的には、C ++の設計者は、誤って使用されやすいため、実行時型情報の追加を回避するために何年も費やしました。しかし、彼らは最終的に彼らが負けた戦いの間違った終わりにいると判断し、追加dynamic_castしましtypeinfo()た。C++0xはさらに追加します。

于 2010-12-13T07:30:33.067 に答える
1

別のアプローチ、

if ( typeid(*pBase) == typeid(A))
{
      cout << "A" << endl;
}
else if ( typeid(*pBase) == typeid(B))
{
      cout << "B" << endl;
}
else if ( typeid(*pBase) == typeid(C))
{
      cout << "C" << endl;
}
else
{
      cout << "something else" <<endl;
}

しかし、私はJamesのアプローチを好みます。これを使用すると、タイプを判別するだけでなく、後で操作するタイプキャストインスタンスも使用できるからです。

于 2010-12-13T07:28:46.140 に答える