c++ 14 (VS 2015) 具有受保护继承的 shared_ptr - 没有合适的用户定义转换

问题描述 投票:0回答:1

使用具有受保护继承的共享指针时出现奇怪的编译错误。下面的简单代码无法编译并给出错误“没有合适的用户定义的转换”,但它适用于公共继承。不知道为什么,谁能解释一下?

class ioptionpricer
{
public:
    virtual std::shared_ptr<ioptionpricer> clone() const = 0;
    virtual void doSomething() const = 0;
    virtual ~ioptionpricer() = default;
};

class optionpricer : protected ioptionpricer
{
public:
    std::shared_ptr<ioptionpricer> clone() const
    {
        return std::make_shared<optionpricer>(*this);
    }
};
c++ c++14 shared-ptr protected
1个回答
0
投票

当继承是私有的(或受保护的)时,则不能在类(或受保护继承的派生类)之外将

derived*
转换为
base*

在从

shared_ptr<derived>
shared_ptr<base>
的转换的情况下,从
derived*
base*
的转换发生在模板
shared_ptr<T>
的实现中的某个地方。因此,对于私有/受保护的继承,它不会飞。除非你声明
shared_ptr
为朋友。

无论哪种方式,在这些情况下只使用

public
继承,在这种情况下将其设为私有或受保护是没有意义的。

© www.soinside.com 2019 - 2024. All rights reserved.