我可以这样做吗?
class A { ... };
class B : private A
{
const A &foo() const
{
return *((const A *)this);
}
};
我可以从基类中私有地继承并将其强制转换为其基类的公共版本吗?如果没有虚拟方法,我可以这样做吗?
我的猜测是肯定的,但我想确保它安全/便携。
答案 0 :(得分:15)
是的,您可以:§5.4/ 7标准:
......以下static_cast和reinterpret_cast操作 (可选地后跟const_cast操作)可以使用执行 即使是基类,显式类型转换的强制转换表示法 类型无法访问:
指向派生类类型的对象或派生的左值的指针 类类型可以显式转换为指针或引用 分别是明确的基类类型;
但是尽量不因为它违背了私人继承的目的。
答案 1 :(得分:8)
是的,这是明确允许的。 Alexandrescu在Modern C++ Design中广泛使用了这种基于策略的设计方法:
template <typename Policy>
class foo : Policy
{
public:
void do_something()
{
Policy & p = *this;
p.do_something();
}
};
因此虽然用例可能有限,但有一些用例。
答案 2 :(得分:-5)
根据您的问题标题,答案取决于。但是对于你的源代码中的情况,回答是肯定的。
有两个因素会影响答案:
如果您使用C样式转换,它将是,因为如果没有转换可用,则强制转换将调用re-interpert强制转换。您可以将任何类型的指针强制转换为目标指针类型。但如果存在MI,则对于大多数C ++语言实现,结果可能不正确。
如果你在memeber函数中进行了强制转换(没有C样式转换),那么answere将是yes,因为基类可以在成员函数中访问。如果表达式位于基类不可访问的位置,则会出现编译错误。
有关C ++标准中标准转换的更多详细信息
A prvalue of type “pointer to cv D”, where D is a class type, can be converted to a prvalue of type “pointer to cv B”, where B is a base class (Clause 10) of D.
If B is an inaccessible (Clause 11) or ambiguous (10.2) base class of D, a program that necessitates this conversion is ill-formed.
The result of the conversion is a pointer to the base class subobject of the derived class object. The null pointer value is converted to the null pointer value of the destination type.
编辑2:使答案更详细。