我可以使用C样式转换将派生类转换为私有基类吗?

Ada*_*nko 20 c++ casting upcasting private-inheritance

我可以这样做吗?

class A { ... };

class B : private A
{
    const A &foo() const
    {
        return *((const A *)this);
    }
};
Run Code Online (Sandbox Code Playgroud)

我可以从基类中私有地继承并将其强制转换为其基类的公共版本吗?如果没有虚拟方法,我可以这样做吗?

我的猜测是肯定的,但我想确保它安全/便携.

Bat*_*eba 15

是的,您可以:§5.4/ 7标准:

...可以使用显式类型转换的强制转换表示法执行以下static_cast和reinterpret_cast操作(可选地后跟const_cast操作),即使基类类型不可访问:

指向派生类类型的对象的指针或派生类类型的左值可以分别显式地转换为指针或对明确的基类类型的引用;

尽量不要因为它违背私人继承的目的.

  • 建议编辑答案以明确声明这是类似“static_cast”的操作,而不是“reinterpret_cast” (2认同)

nij*_*sen 8

是的,这是明确允许的.Alexandrescu在Modern C++ Design中广泛使用了这种基于策略的设计方法:

template <typename Policy>
class foo : Policy
{
    public:
        void do_something()
        {
            Policy & p = *this;
            p.do_something();
        }
};
Run Code Online (Sandbox Code Playgroud)

因此,尽管用例可能有限,但有一些用例.

  • 但这不是一个C风格的演员吗?它只是从类内部隐式转换为私有基础.我错过了什么吗? (4认同)
  • 您的答案中的代码示例没有任何 C 风格的强制转换,也没有任何无法访问基类“Policy”的代码。因此,它似乎与 OP 询问的任何内容都无关。 (3认同)