在此示例中,为什么视觉工作室编译器允许违反私人继承

Why does Visual Studio compiler allow violation of private inheritance in this example?

本文关键字:编译器 许违反 继承 工作室 视觉 为什么      更新时间:2023-10-16

我在Visual Studio 2013和2017中发现std::unique_ptr的行为非常奇怪。让我们考虑一个示例:

class Base 
{
public:
    virtual ~Base() = default;
    virtual void Foo() = 0;
};
class Derived : private Base 
{
public:
    void Foo() override
    {
        std::cout << "Foo";
    }
};
void Foo(std::unique_ptr<Base> a)
{
    a->Foo();
}
Foo(std::unique_ptr<Base>(new Derived())); // Compiles

请注意,继承是私人的。此示例仅在Visual Studio上编译。此外,虚拟函数调用有效,因为它是公共继承。因此,我们违反了封装违规行为,因为从DerivedBase的演员表应该无法访问。有人可以解释为什么Visual Studio允许这样做吗?这是一个已知问题吗?

下面的行没有为合理原因编译。第一个用法和第二个用法之间的唯一区别是在第二个用法中,创建了命名对象B

std::unique_ptr<Base> B(new Derived()); // Doesn't compile

它是否以某种方式与仍未解决的问题相关?

这是在cl版本中修复的19.15.26726(VS 2017 v15.9.0-pre.1.0(:

Foo(std::unique_ptr<Base>(new Derived()));

给出

error C2243: 'type cast': conversion from 'Derived *' to 'Base *' exists, but is inaccessible