gpt4 book ai didi

c++ - C++ 协方差返回类型的缺点是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 15:12:00 24 4
gpt4 key购买 nike

我最近不得不处理 C++ covariance return types例如以下结构:

struct Base
{
virtual ~Base();
};
struct Derived : public Base {};

struct AbstractFactory
{
virtual Base *create() = 0;
virtual ~AbstractFactory();
};

struct ConcreteFactory : public AbstractFactory
{
virtual Derived *create()
{
return new Derived;
}
};

它允许客户端代码在需要时将Derived 对象视为Base 类型或Derived 类型,尤其是在不使用dynamic_caststatic_cast

这种方法有什么缺点?这是糟糕设计的标志吗?

谢谢。

最佳答案

协变不适用于智能指针,因此协变违反了:

Never transfer ownership by a raw pointer (T*) or reference (T&) C++ 核心指南。有一些技巧可以限制这个问题,但协变值仍然是一个原始指针。

文档中的示例:

X* compute(args)    // don't
{
X* res = new X{};
// ...
return res;
}

这几乎与问题中的代码所做的相同:

virtual Derived *create()
{
return new Derived;
}

不幸的是,以下对于 shared_ptrunique_ptr 都是非法的:

struct AbstractFactory
{
virtual std::shared_ptr<Base> create() = 0;
};

struct ConcreteFactory : public AbstractFactory
{
/*
<source>:16:38: error: invalid covariant return type for 'virtual std::shared_ptr<Derived> ConcreteFactory::create()'
*/
virtual std::shared_ptr<Derived> create()
{
return std::make_shared<Derived>();
}
};

编辑

n.m.'s answer展示了一种模拟语言协变的技术,以及一些额外的代码。它有一些潜在的维护成本,因此在决定采用哪种方式之前请考虑到这一点。

关于c++ - C++ 协方差返回类型的缺点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54439944/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com