我在私有继承的基类对象和子对象之间有以下三种类型转换,其中两个有效,但最后一个没有。我想知道是什么导致了不同的结果。
example.com/cat1/cat2/cat3/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
}
不是'* this' - 因为两者都是对象吗?那么No.1为什么会起作用呢?
如果是因为范围,那么为什么No.2有效呢?任何人都可以解释一下它们背后的机制,它们之间有什么区别吗?
此外,第一种方法似乎创建了一个字符串对象。在私有继承的情况下,基类引用不能设置为派生类对象。那么如何创建临时字符串对象?
提前致谢。
答案 0 :(得分:2)
test
子类string
,因此test
“知道”它是string
,但外面的任何人都没有。{/ p>
在您的第一种情况下,会发生的情况如下:
在test
(main
)之外,您调用show
方法。没关系,因为它是公开的。
现在,在show
内,代码“知道”它的类型为string
,因为它是test
的方法。转换没问题。
在第三种情况下,您正试图从main
开始进行外部转换。在test
之外,main
“不知道”test
是string
。
你的第二个案件如何运作呢?您正在执行C-style cast from a derived to public base。令人惊讶的是,这是允许的(虽然不一定是好的风格!)。引用接受的答案:标准的第5.4 / 7节:
...以下static_cast和reinterpret_cast操作(可选地后跟const_cast操作)可以使用显式类型转换的强制转换表示法执行,即使基类类型不可访问:指向派生类对象的指针类型或派生类类型的左值可以分别显式转换为指向或明确基类类型的引用;