2016-04-28 74 views
0

當讀取項目27最小化在C++有效鑄造,它說,不要試圖用static_cast在派生類中投*this基類。這是因爲static_cast<Base>(*this)將創建一個基類的臨時對象。我嘗試了一個例子,但是,它總是使用不同的編譯器輸出10,例如clang 3.8和gcc 4.9,5.3。的static_cast派生此對象的基類在C++中

我錯了嗎?

#include <iostream> 

    class A { 
    public: 
    int a; 
    virtual void foo() {std::cout << a << std::endl;} 
    }; 

    class B : public A { 
    public: 
    int b; 
    void foo() { static_cast<A>(*this).foo();} 
    }; 


    int main() { 
    B b; 
    b.a = 10; 
    b.foo(); 

    return 0; 
    } 

的問題是,爲什麼static_cast會創建一個臨時對象。

+2

爲什麼不打印10? – emlai

+0

問題是什麼?你想解決什麼問題? –

+0

有效的C++說static_cast(* this)將創建一個Base類的臨時對象。所以在這樣的假設下,我認爲它應該輸出0.這是正確的嗎? – kwunlyou

回答

-1

首先,您不必投射派生 - >基礎,因爲它會自動發生。是的,static_cast將創建一個你投射到的類型的對象。 你的情況,以使多態您可以使用引用或指針:

int main(){ 
    B b; 
    A &a = b; // no explicit cast needed 
    a.foo(); // will call B::foo 

    //OR 

    B *bPtr = new B; 
    A *aPtr = bPtr; // no explicit cast needed 
    aPtr->foo(); // same as above 
} 
+0

謝謝。其實,我想創建一個例子來驗證static_cast (* this)會創建一個臨時對象。但我搞砸了自己。 – kwunlyou

2

一個更有意義的例子是這樣:

#include <iostream> 

class A { 
public: 
    virtual void foo() { std::cout << "A" << std::endl; } 
}; 

class B : public A { 
public: 
    virtual void foo() { std::cout << "B" << std::endl; } 
    void bar() { static_cast<A>(*this).foo(); } 
}; 

int main() { 
    B b; 
    b.bar(); 
} 

我期望bar打印B,爲foo是一個重寫的方法。它打印A
那麼,從語言的角度來看,從開發人員的角度來看,這不太好,因爲他們期望得到完全不同的結果。

如果改用以下類它的工作原理:

class B : public A { 
public: 
    virtual void foo() { std::cout << "B" << std::endl; } 
    void bar() { static_cast<A*>(this)->foo(); } 
}; 

而且下面一個按預期工作(增加了清楚起見,由於@MORTAL在評論):

class B : public A { 
public: 
    virtual void foo() { std::cout << "B" << std::endl; } 
    void bar() { static_cast<A&>(*this).foo(); } 
}; 

無論如何,您正面臨的問題被命名爲切片
這就是爲什麼使用static_cast<A>(*this)不鼓勵,如果你不知道你在做什麼。

有關詳細信息,請參見here

+0

謝謝。其實,我想創建一個例子來驗證static_cast (* this)會創建一個臨時對象。但我搞砸了自己。 – kwunlyou

+1

答案中的示例實際上創建了一個臨時對象。 – skypjack

+0

我寧願'static_cast (* this)。foo()'而不是'static_cast (this) - > foo()' – MORTAL

相關問題