这个问题已经在这里有一个答案:
- 我可以投一个派生类专用基类,使用C样式转换? 3个回答
假设我们有这样的代码
class A {
public:
A() : x(1) {}
virtual ~A() {}
int x;
};
class B {
public:
B() : y(2) {}
virtual ~B() {}
void g()
{
cout << "B::" << y << endl;
}
int y;
};
class C : private A, private B {
public:
void f()
{
B* p = static_cast<B*>( this );
p->g();
}
};
int main()
{
C c;
((B*)&c)->g();
return 0;
}
在主函数的C风格的类型转换无法在C ++强制类型转换(的角度来正确表达static_cast
, dynamic_cast
, reinterpret_cast
)。 但是,什么是让这个摆在首位的原因是什么? 不会疼封装?
UPDATE这不是链接的问题的重复,因为这个问题是关于C ++的设计决策。 它不问什么我可以或不可以用语言做什么,问为什么某些决定可能已产生。
当指针之间使用一个基类和派生类C风格的指针转换,它像一个static_cast
-即使基本是私人的。
(C-风格转换之间不相关的指针类型reinterpret_cast
多个)。
标准说:
通过进行转换
- const_cast类型转换(5.2.11),
- 一个的static_cast(5.2.9),
- 一个的static_cast其次const_cast类型转换,
- 一个的reinterpret_cast(5.2.10),或
- 一个的reinterpret_cast其次const_cast类型转换,
可以使用明确的类型转换的转换符号来执行。 同样的语义限制和行为适用,与在下列情况下执行的static_cast 转换是有效的,即使基类是不可访问的例外:
- 一个指向派生类型或左值或派生类类型的右值的对象可以被显式转换为一个指针或引用明确基类型,分别;
- 一个指向派生类类型的成员可被显式转换为一个指针的明确非虚拟基类类型的成员;
- 一个指针的明确非虚拟基类型的对象,明确的非虚拟基类型,或指针的明确非虚拟基类类型的成员的glvalue可以明确地转换为指针,的引用,或一个指针指向一个派生类类型的成员,分别。
你的情况在第一点被描述,所以转换所做static_cast
和指针被调整。
这是因为在C它被允许使用这种强制转换为任何指针转换为任何其他指针和C ++努力做到尽可能C兼容,但会尝试做好是正确的,当涉及到类,所以C风格演员阵容强于reinterpret_cast
这种情况。
A C样式转换允许您将任何类型转换为任何其他类型。 你可以这样做(std::istream*)&c
,如果你愿意,但并不推荐。
文章来源: Why does C style cast allow you to convert to a private base class? [duplicate]