使用具有受保护继承的共享指针时出现奇怪的编译错误。下面的简单代码无法编译并给出错误“没有合适的用户定义的转换”,但它适用于公共继承。不知道为什么,谁能解释一下?
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);
}
};
当继承是私有的(或受保护的)时,则不能在类(或受保护继承的派生类)之外将
derived*
转换为 base*
。
在从
shared_ptr<derived>
到 shared_ptr<base>
的转换的情况下,从 derived*
到 base*
的转换发生在模板 shared_ptr<T>
的实现中的某个地方。因此,对于私有/受保护的继承,它不会飞。除非你声明shared_ptr
为朋友。
无论哪种方式,在这些情况下只使用
public
继承,在这种情况下将其设为私有或受保护是没有意义的。