Vik*_*tor 8 c++ encapsulation unique-ptr visual-studio private-inheritance
我std::unique_ptr在Visual Studio 2013和2017中发现了非常奇怪的行为.让我们考虑一个例子:
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
Run Code Online (Sandbox Code Playgroud)
请注意,继承是私有的.此示例仅在Visual Studio上编译.而且,虚函数调用有效,因为它是公共继承.因此,我们有封装侵犯,因为从演员Derived到Base应该无法访问.任何人都可以解释为什么Visual Studio允许这样做?这是一个已知的问题吗?
由于合理的原因,下面的行无法编译.第一个和第二个用法之间的唯一区别在于第二个,B创建了命名对象.
std::unique_ptr<Base> B(new Derived()); // Doesn't compile
Run Code Online (Sandbox Code Playgroud)
是否与此问题有关,仍然没有修复?
cl此问题已在版本 19.15.26726(VS 2017 v15.9.0-pre.1.0)中修复:
Foo(std::unique_ptr<Base>(new Derived()));
Run Code Online (Sandbox Code Playgroud)
给出
error C2243: 'type cast': conversion from 'Derived *' to 'Base *' exists, but is inaccessible
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
292 次 |
| 最近记录: |