三个显式向上转换到私有基础的区别 class

Difference among three explicit upcasting to a private base class

我在私有继承基础 class 对象和子对象之间进行了以下三种类型转换,其中两种有效,但最后一种无效。我想知道是什么导致了不同的结果。

#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 有效?谁能解释一下它们背后的机制,使它们之间产生差异?

另外,第一个方法似乎创建了一个字符串对象。在私有继承的情况下,base class 引用不能设置为派生的 class 对象。那么临时字符串对象是如何创建的呢?

提前致谢。

test 私有地子类 string,所以 test "knows" 它是一个 string,但是外面的任何人都不是。

在你的第一种情况下,会发生如下情况:

  1. test之外(在main),你调用了show方法。没关系,因为它是 public.

  2. 现在,在 show 中,代码 "knows" 属于 string 类型,因为它是 test 的方法。转换成功。

不过,在您的第三种情况下,您正尝试从 main 进行外部转换。在 testmain "doesn't know" 之外 teststring.

那么你的第二个案例是如何运作的呢?您正在执行 C-style cast from a derived to public base。令人惊讶的是,这是允许的(虽然不一定是好的风格!)。引用那里接受的答案:标准的§5.4/7:

... the following static_cast and reinterpret_cast operations (optionally followed by a const_cast operation) may be performed using the cast notation of explicit type conversion, even if the base class type is not accessible: a pointer to an object of derived class type or an lvalue of derived class type may be explicitly converted to a pointer or reference to an unambiguous base class type, respectively;