三个显式向上转换到私有基础的区别 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
,但是外面的任何人都不是。
在你的第一种情况下,会发生如下情况:
在test
之外(在main
),你调用了show
方法。没关系,因为它是 public.
现在,在 show
中,代码 "knows" 属于 string
类型,因为它是 test
的方法。转换成功。
不过,在您的第三种情况下,您正尝试从 main
进行外部转换。在 test
、main
"doesn't know" 之外 test
是 string
.
那么你的第二个案例是如何运作的呢?您正在执行 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;
我在私有继承基础 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
,但是外面的任何人都不是。
在你的第一种情况下,会发生如下情况:
在
test
之外(在main
),你调用了show
方法。没关系,因为它是 public.现在,在
show
中,代码 "knows" 属于string
类型,因为它是test
的方法。转换成功。
不过,在您的第三种情况下,您正尝试从 main
进行外部转换。在 test
、main
"doesn't know" 之外 test
是 string
.
那么你的第二个案例是如何运作的呢?您正在执行 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;