为什么Visual Studio编译器允许在此示例中违反私有继承?

时间:2017-04-20 20:09:22

标签: c++ visual-studio encapsulation unique-ptr private-inheritance

我在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

它是否与this issue以某种方式相关仍未修复?

1 个答案:

答案 0 :(得分:1)

此问题已在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