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

时间:2013-07-29 13:16:39

标签: c++ casting upcasting private-inheritance

我可以这样做吗?

class A { ... };

class B : private A
{
    const A &foo() const
    {
        return *((const A *)this);
    }
};

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

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

3 个答案:

答案 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)

根据您的问题标题,答案取决于。但是对于你的源代码中的情况,回答是肯定的。

有两个因素会影响答案:

  1. 如果您使用C样式转换,它将是,因为如果没有转换可用,则强制转换将调用re-interpert强制转换。您可以将任何类型的指针强制转换为目标指针类型。但如果存在MI,则对于大多数C ++语言实现,结果可能不正确。

  2. 如果你在memeber函数中进行了强制转换(没有C样式转换),那么answere将是yes,因为基类可以在成员函数中访问。如果表达式位于基类不可访问的位置,则会出现编译错误。

  3. 有关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:使答案更详细。