私はいつもC言語のCスタイルのキャストはreinterpret_castと同じだと読んでいます。しかし、Visual Studioでこのコードをテストしたところ、Cスタイルのキャストは静的なキャストと同じ動作をしているようです。なぜ誰が知っていますか?これはバグのように思える...C++でのCスタイルのキャストが奇妙な動作をする
#include <string>
#include <iostream>
class Thing1
{
std::string theString;
public:
Thing1(const std::string& theString) : theString(theString)
{
//
}
std::string getTheString()
{
return theString;
}
};
class Thing2
{
std::string theString;
public:
Thing2(const std::string& theString) : theString(theString)
{
//
}
std::string getTheString()
{
return theString;
}
};
class Thing3 : public Thing1, public Thing2
{
public:
Thing3(const std::string& theString1, const std::string& theString2) : Thing1(theString1), Thing2(theString2)
{
//
}
};
int main()
{
Thing3* thing3 = new Thing3("string1", "string2");
uintptr_t t3ptr = (uintptr_t)thing3;
uintptr_t t1ptr = (uintptr_t)((Thing1*)thing3);
uintptr_t t2ptr = (uintptr_t)((Thing2*)thing3);
std::cout << t1ptr << std::endl;
std::cout << t2ptr << std::endl;
std::cout << t3ptr << std::endl;
std::cin.ignore();
return 0;
}
このコードは出力が得られます。
17563752
17563780
17563752
Cスタイルのキャストは、reinterpret_castと必ずしも同じである必要はありません。 C++では、Cスタイルのキャストはreinterpret_castまたはstatic_castが実行しない場合はconst_castと同等です。私は物事を過度に単純化していないことを願っていますが、それはその問題の要点だと私は信じています。 – antred
*「私はいつもC言語のCスタイルのキャストはreinterpret_castと同じだと読んでいます」* - あなたは正しく覚えていないか、読んだ資料の選択に特に不利でした。 – IInspectable
C++のキャスト* always *を使用することをお勧めします。彼らはもっと明示的にあなたがしたいことを言っています*彼らはソースコードで検索する方が簡単です。もちろん、*最高の*はコードを設計することで、(あるいはごくわずかな)キャストが必要となることはありません。 –