2016-09-01 50 views
3

在私有繼承的基類對象和子對象之間有以下三種類型轉換,其中兩種工作,但最後一種不支持。我想知道是什麼導致了不同的結果。三個顯式向上向私有基類的區別

#include<iostream> 
#include <string> 
using namespace std; 
class test :private string 
{ 
public: 
    test(string st) :string(st){} 
    void show(); 
}; 

void test::show() 
{ 
    cout << (string)*this << endl; // typecasting 1, works, display "abcd" 
} 
int main() 
{ 
    test a("abcd"); 
    a.show(); 

    cout << (string &)a << endl; //typecasting 2, works, display "abcd" 

    cout<<(string)a<<endl; //typecasting 3; error C2243: 'type cast' : conversion from 'test *' to 'const std::basic_string<char,std::char_traits<char>,std::allocator<char>> &' exists, but is inaccessible  
} 

不是a是否與'* this'相同 - 因爲兩者都是對象?那麼爲什麼No.1工作?
如果是因爲範圍,那爲什麼No.2有效?任何人都可以請解釋他們背後的機制,使他們之間的差異?

此外,第一種方法似乎創建一個字符串對象。在私有繼承的情況下,不能將基類引用設置爲派生類對象。那麼如何創建臨時字符串對象呢?

在此先感謝。

+0

你不能真正做直接值繼承鑄造。這通常只適用於指針和引用。 '* this'是一個'const&'這就是爲什麼它在這裏「起作用」。 'string&'相同。但是,使用直接值不能將一種類型轉換爲另一種類型。我也不確定你的演員在某些時候是否有副作用(投射一個值,反之亦然)。對於其他人:我知道這是測試代碼,但請不要在實際項目中那樣編碼;) – Hayt

+0

非常感謝。請問如何在基類引用不能設置爲派生類對象時創建臨時字符串obj?當我們做明確的上傳時,它是否祕密地將'* this'作爲基類的參考?此外,我不會在一個真正的項目中做到這一點:)我碰到了一個錯字.. –

+0

你提到'* this'是一個'const&'類型。你能否指點我參考一下。我很抱歉,我查了一下,但沒有找到相關信息(可能是因爲關鍵詞太廣泛使用。)謝謝 –

回答

2

test小類string私人所以test「知道」這是一個string,但外面的任何人都沒有。

在你的第一種情況下,會發生什麼情況如下:

  1. test(在main),調用show方法。沒關係,因爲它是公開的。

  2. 現在,在show裏面,代碼「知道」它的類型爲string,因爲它是test的一種方法。轉換是確定的。

在你的第三個情況下,雖然,你想外面做轉換,從main。在test之外,main「不知道」teststring

你的第二種情況如何運作?您正在執行C-style cast from a derived to public base。令人驚訝的是,這是允許的(雖然不一定是好風格!)。該標準的第5.4節/ 7:從所述接受的答案有引用

...下面的static_cast和reinterpret_cast的操作(可選地,接着const_cast類型轉換操作)可使用明確的類型轉換的轉換符號進行,即使基類類型不可訪問:指向派生類類型的對象的指針或派生類類型的左值可分別顯式地轉換爲指針或對明確的基類類型的引用;

+0

謝謝請問如何在基類引用不能設置爲派生類對象時創建臨時字符串obj?是否也因爲在'test'類中,他們知道繼承,因此可以設置基類引用到一個私有的派生類對象? –

+0

@FlowCloud你是在談論第一個案例嗎? –

+0

是的,我在談論第一個案例。謝謝 –

相關問題