1

Class AClass B派生元Class A、およびClass C派生元があるとしましょうClass B

のオブジェクトを作成しますClass Cが、ポインターは型 A の変数に割り当てられます。

A *a = new C() ;

が、 またはのどちらaのタイプであるかを、実行時にどのように知ることができますか?Class AClass BClass C

いくつかのデバッグ ログを記録し、オブジェクトのタイプを出力する必要があります。

4

4 に答える 4

3

(クラスがポリモーフィックであると仮定します)動的ポリモーフィズムを使用することの要点は、オブジェクトの正確な型を知らなくてもランタイムに必要な処理をさせることです。オブジェクトのタイプ
に 依存するコードを書き始めると、コードがより緊密に結合されます。 ただし、 何らかの理由でタイプを知りたい場合は、typeidまたはdynamic_castを使用できます。

于 2012-10-11T13:33:42.923 に答える
2

これを決定するための組み込みの方法はないと思います。私が考えることができる唯一のオプションは、クラスAに仮想関数を与えることです。

class A {
  public:
    virtual int getType() const {
        return 'A';
    }
};

class B : public A {
  public:
    virtual int getType() const {
         return 'B';
    }
};

タイプの問題が発生する可能性があります。スマートフォンからの書き込み。

于 2012-10-11T13:38:01.800 に答える
1

A仮想関数がある場合は、RTTIを使用してそのランタイムタイプを説明する文字列を取得できます。

A *a = could_return_an_object_of_any_derived_class();

cout << typeid(*a).name();

によって返される文字列は、name()人間にわかりやすいことが保証されているわけではなく、コンパイラによって異なる場合があります。保証されているのは、クラスごとに異なることだけです。

于 2012-10-11T13:37:09.247 に答える
1

通常、これは仮想関数の目的です。

struct A
{
    virtual ~A() { }
    virtual char const * name() const { return "Class A"; }
};

struct B : A
{
    virtual char const * name() const { return "Class B"; }
};

struct C : B
{
    virtual char const * name() const { return "Class C"; }
};

今、あなたは言うことができます:

#include <iostream>

void print_me(A const & x)
{
    std::cout << "I am " << x.name() << ".\n";
}

(または、あなたの例で使用しますが、通常は裸のポインターやC ++をa->name()使用するべきではないため、その例は好きではありません。)new

于 2012-10-11T13:39:23.267 に答える