1

ここで、コードなしで説明するのが難しいことを正確に示します。

class Object
{ 
      // attributes..
};

class Attribute
{
    public:
    void myfunc(); 
};

class Character: public Object, public Attribute
{ 

};

void main()
{
    Object* ch = new Character;
    // How can I call the myfunc() from Attribute
    // tried static_cast<Attribute*>(ch);
}

私はオブジェクト クラス ポインターしか持っておらず、属性クラスから継承するのが文字オブジェクトなのか別のオブジェクトなのかわかりません。クラスが属性クラスから継承されていることはわかっています。

4

2 に答える 2

3

クロス キャストは、dynamic_cast によってのみ実行できます。

Object * o = new Character;
Attribute * a = dynamic_cast<Attribute*>(o);

if (!a) throw_a_fit();

a->myfunc();

ただし、これが機能するには、ポリモーフィックな基本クラスが必要です (少なくとも 1 つの仮想関数が必要です)。

于 2012-05-20T15:52:57.610 に答える
2

正しい型のオブジェクトがあることがわかっている場合は、明示的にキャストできます。

Object * ch = /* something that's a Character */

static_cast<Attribute *>(static_cast<Character *>(ch))->myfunc();

chが指す最も派生したオブジェクトの型が のサブタイプでない場合、明らかにこれは正しくありませんAttribute

クラス階層がポリモーフィックである場合 (つまり、関心のある各基本クラスに少なくとも 1 つの仮想関数がある場合)、dynamic_cast実行時に直接使用して成功したかどうかを確認できますが、これは比較的高価な操作です。対照的に、静的キャストでは、実行時のコストはまったく発生しません。

于 2012-05-20T16:01:48.277 に答える