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     
}

与 '*this'不a一样 - 因为两者都是对象?那么为什么 No.1 有效呢?
如果是因为范围,那么为什么 No.2 有效?任何人都可以解释一下它们背后的机制吗?

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

提前致谢。

4

1 回答 1

2

teststring私下子类,所以test“知道”它是 a string,但外面的任何人都不知道。

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

  1. test(in main) 之外,您调用该show方法。没关系,因为它是公开的。

  2. 现在,在内部show,代码“知道”它是 type string,因为它是test. 转换正常。

但是,在您的第三种情况下,您尝试在外部进行转换,从main. 在 之外testmain“不知道”那test是一个string.

那么你的第二个案例是如何工作的呢?您正在执行从派生到公共基础的 C 风格转换。令人惊讶的是,这是允许的(尽管不一定是好的风格!)。引用那里接受的答案:标准的§5.4/7:

...即使基类类型不可访问,也可以使用显式类型转换的强制转换表示法执行以下 static_cast 和 reinterpret_cast 操作(可选地后跟 const_cast 操作):指向派生类类型对象的指针或派生类类型的左值可以分别显式转换为指向明确基类类型的指针或引用;

于 2016-09-01T08:21:40.217 回答