c++ - 为什么 Visual Studio 编译器在此示例中允许违反私有(private)继承?

标签 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

请注意,继承是私有(private)的。此示例仅在 Visual Studio 上编译。而且,虚函数调用是有效的,因为它是公共(public)继承。所以我们有封装违规,因为从 DerivedBase 的转换应该是不可访问的。谁能解释为什么 Visual Studio 允许这样做?这是一个已知问题吗?

出于合理原因,下面的行无法编译。第一种用法和第二种用法之间的唯一区别在于第二种用法,命名对象 B 被创建。

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

它是否与 this issue 有某种关联?哪个还没有修复?

最佳答案

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

关于c++ - 为什么 Visual Studio 编译器在此示例中允许违反私有(private)继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43528976/

相关文章:

c++ - 用颜色填充随机区域

c++ - 算法:合并 std::unordered_map

visual-studio - Visual Studio 2015 中的后期绑定(bind)错误

validation - 封装属性转换/验证

C++ string.length() 不可用于常量表达式

c++ - 自定义容器基于范围的迭代

visual-studio - 在 tfs 中看不到联机选项

visual-studio - Visual Studio中的Web引用和服务引用之间的区别?

api - API 中要公开多少低级内容?

java - 实现不违反封装的 OOP 委托(delegate)