3

プライベートに継承された基本クラス オブジェクトと子オブジェクトの間に次の 3 つの型キャストがあります。そのうちの 2 つは機能しますが、最後の 1 つは機能しません。何が異なる結果をもたらすのか疑問に思っています。

#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が機能するのですか?それらの間の違いを生むそれぞれの背後にあるメカニズムを誰か説明してもらえますか?

また、最初のメソッドは文字列オブジェクトを作成するようです。private 継承の場合、基底クラス参照を派生クラス オブジェクトに設定することはできません。では、一時的な文字列オブジェクトはどのように作成されるのでしょうか?

前もって感謝します。

4

1 に答える 1

2

teststring非公開でサブクラス化するため、testそれが であることを「認識」しますが、string外部の誰もが認識しません。

最初のケースでは、次のようになります。

  1. の外側test(内main) で、メソッドを呼び出しますshow。公立なので大丈夫です。

  2. の内部では、コードは のメソッドであるためshow、タイプが であることを「認識」しています。変換はOKです。stringtest

ただし、3 番目のケースでは、変換を外部で実行しようとしていますmain。の外ではtestmain「わからない」、それteststringです。

では、2 番目のケースはどのように機能しますか? 派生から public base への C スタイルのキャストを実行しています。驚くべきことに、これは許可されています (ただし、必ずしもスタイルが良いとは限りません!)。そこで受け入れられた回答からの引用:標準の§5.4/7:

... 次の static_cast および reinterpret_cast 操作 (オプションで const_cast 操作が続く) は、明示的な型変換のキャスト表記を使用して実行できます。基底クラスの型にアクセスできない場合でも: 派生クラス型のオブジェクトへのポインターまたは派生クラス型の左辺値は、明確な基本クラス型へのポインターまたは参照にそれぞれ明示的に変換できます。

于 2016-09-01T08:21:40.217 に答える