24

我可以这样做吗?

class A { ... };

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

我可以采用从基类私有继承的子类并将其转换为其基类的公共版本吗?我可以在没有虚拟方法的情况下做到这一点吗?

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

4

3 回答 3

17

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

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

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

尽量不要这样做,因为它违背了私有继承的目的。

于 2013-07-29T13:21:22.107 回答
7

是的,这是明确允许的。Alexandrescu 在现代 C++ 设计中广泛使用了这一点,用于他的基于策略的设计方法:

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

因此,虽然用例可能有限,但还是有一些。

于 2013-07-29T13:25:06.753 回答
-5

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

有两个因素会影响答案:

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

  2. 如果你在成员函数内部进行转换(没有 C 风格转换),答案将是肯定的,因为基类在成员函数内部是可访问的。如果表达式位于基类不可访问的位置,则会出现编译错误。

在 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:让回答者更详细。

于 2013-07-29T13:24:34.460 回答