在私有繼承的基類對象和子對象之間有以下三種類型轉換,其中兩種工作,但最後一種不支持。我想知道是什麼導致了不同的結果。三個顯式向上向私有基類的區別
#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有效?任何人都可以請解釋他們背後的機制,使他們之間的差異?
此外,第一種方法似乎創建一個字符串對象。在私有繼承的情況下,不能將基類引用設置爲派生類對象。那麼如何創建臨時字符串對象呢?
在此先感謝。
你不能真正做直接值繼承鑄造。這通常只適用於指針和引用。 '* this'是一個'const&'這就是爲什麼它在這裏「起作用」。 'string&'相同。但是,使用直接值不能將一種類型轉換爲另一種類型。我也不確定你的演員在某些時候是否有副作用(投射一個值,反之亦然)。對於其他人:我知道這是測試代碼,但請不要在實際項目中那樣編碼;) – Hayt
非常感謝。請問如何在基類引用不能設置爲派生類對象時創建臨時字符串obj?當我們做明確的上傳時,它是否祕密地將'* this'作爲基類的參考?此外,我不會在一個真正的項目中做到這一點:)我碰到了一個錯字.. –
你提到'* this'是一個'const&'類型。你能否指點我參考一下。我很抱歉,我查了一下,但沒有找到相關信息(可能是因爲關鍵詞太廣泛使用。)謝謝 –