我在 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)继承。所以我们有封装违规,因为从 Derived
到 Base
的转换应该是不可访问的。谁能解释为什么 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/