我在书中看到了这个例子:
class Test: private std::string
{
public:
Test():std::string("How?")
{
}
};
int main(int argc, char** argv)
{
Test t;
std::cout<<(std::string&)t<<std::endl;
return 0;
}
我不知道它是如何印刷的&#34;如何&#34;当我说出类名?是因为运营商?但我知道,当你进行私有继承时,公共和受保护的变量和方法将被视为&#34;私有&#34;外部。
所以我的问题是,它是如何完全印刷的&#34;如何&#34; ?
编辑:
所以谁持有字符串值&#34;如何&#34;它是如何打印的?因为它是通过类型转换打印的。
答案 0 :(得分:6)
这说明了C风格演员的危险之一:它是唯一忽略继承访问说明符的演员。正如你所看到的,演员成功地挖出了std::string
基础参考,即使它是私有的。如果您使用static_cast
尝试此操作,则无法编译。
编辑:
std::string
t
的{{1}}子对象在"How"
的构造函数中初始化时Test
持有$cat_id
。转换为对基类的引用用于访问相应的子对象。
答案 1 :(得分:3)
强制转换(std::string&)t
将t
转换为对其基类std::string
的实例的引用。 C样式转换是唯一可以转换为无法访问的基类的转换。效果与普通隐式转换为可访问的基类相同。