0

C++について疑問がstatic_castあります。すでに設定されているメンバー変数(派生変数からベース変数に渡すことができない変数を除く)を保持することにより、ポインターが指しているオブジェクトをクラスからクラスdynamic_cast完全に変更しますか?AB

私は私が次のようなものを持っている場合に気づきました

struct Base
{
    Base() { }
    virtual ~Base() { }
    virtual void Method() { cout << "Base Method"; }
};

class Derived : public Base
{
public:
    virtual void Method() { cout << "Override Method"; }
};

struct Derived2 : public Derived
{
    Derived2() { cout << "Derived2 constructor"; }
    void Method() { cout << "Override2 Method"; }
};

int main()
{       
    Base *myPointer = new Derived();    
    static_cast<Derived2*>(myPointer)->Derived2::Method();   
    delete myPointer;    
    return 0;
}

コンストラクターは呼び出されませんが、メソッドは呼び出されます。これはどのように可能ですか?

4

1 に答える 1

12

キャストはオブジェクトをまったく変更しません。これらは、継承階層内の関連するクラスタイプへの異なるポインタを提供するだけです。

Derived x;

Base         * p = &x;
AnotherClass * q = dynamic_cast<AnotherClass*>(p);

// q may or may not be NULL

たとえば、上記の動的キャストは、階層がAnotherClass : Baseあり、Derived : AnotherClass(そしてBase多形である)場合に成功します。

Astatic_castは通常、より派生した動的型があることをすでに知っているが、ベースへのポインターまたは参照しかない場合に使用できます。

(静的キャストを使用して仮想ベースからキャストすることはできません。その場合は常に必要dynamic_castです。)

于 2012-08-27T22:27:59.403 に答える