2012-08-27 35 views
0

我對C++中的static_castdynamic_cast有一些疑問。他們完全通過保留已經設置的成員變量(除了不能從派生到基地傳遞的那些變量除外),將一個指針從類A指向的類指向一個類Bstatic_cast/dynamic_cast:它是否更改對象?

我注意到,如果我有像

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; 
} 

的構造不叫,但該方法確實。這怎麼可能?

回答

11

演員根本不會更改對象。他們只給你一個不同的指針在繼承層次相關的類類型:

Derived x; 

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

// q may or may not be NULL 

例如,如果我們有一個層次AnotherClass : BaseDerived : AnotherClass(和Base是多態)以上的動態轉換成功。

一個static_cast通常可以使用,當你已經知道你有更多的派生的動態類型,但碰巧有隻指針或引用一個基地。

(靜態鑄造永遠不能用於從虛擬基投,在這種情況下,你總是需要dynamic_cast。)

+0

那麼怎麼來了,是一個派生類對象調用它和底座的構造,但如果我從派生類切換到派生類的派生類構造函數不被調用? –

+0

@JohnnyPauling:我不明白你的問題,但我相信你所經歷的並不是與鑄造有關。請更新您的問題以包含您的問題的*最少*,*完整*示例。 –

+0

等一下,我會改變它 –

相關問題