[英]Disallowing overriding virtual method returning const reference with a method returning non-const reference
[英]Pure virtual method returning const reference
我有一个抽象class AbstractClass
。 我所有的派生类都应具有一些const std::vector
但...此字段与派生class
(具有类型)相关联-与实例无关。 因此,将其设置为static
可能很棒。 当然,我不能在基类中定义它,也不能强迫在将来可以添加的每个派生类中实现它。
因此,我希望有人将定义新的派生类将其实现为static
。 (如果没有,程序应该可以正常运行,但是会占用不必要的内存...。)。
所以我有一个纯vitual
方法返回这个变量:
virtual const std::vector<SomeType>& getVec() const = 0;
我现有的派生类定义为:
class DerivedClass : public AbstractClass
{
public:
const std::vector<SomeType>& getVec() const { return vec; }
private:
static const std::vector<SomeType> Vec;
}
我尽力做到这一点,并考虑其他程序员添加新的派生类并以不同的方式实现它的可能性。例如:
const std::vector<SomeType>& getVec() const { return std::vector<SomeType>{ arg1, arg2}; }
我将返回的类型定义为const reference
因为我想避免复制(以防Vec
是类的成员)...公开此方法是否安全? 返回const reference
是否有任何危险?
公开此方法可以安全吗?
是的。
返回
const reference
是否有任何危险?
不,没有。
如果另一个开发人员按照您所显示的方式实现了该接口,那么他们最终将在代码中出现未定义的行为,并且迟早它会失败。
没有语言功能可以阻止您使用其他界面并错误地实现它。
您可以通过提供一个不同的接口来继承来执行设计,而CRTP可以实现所需的行为。 您希望每个类都有一个std::vector
静态对象吗? 您执行以下操作1 :
class AbstractClass
{
template<typename>
friend class DerivedBase;
AbstractClass() = default;
public:
virtual const std::vector<SomeType>& getVec() const = 0;
};
template<typename CRTP>
class DerivedBase : AbstractClass
{
protected:
DerivedBase() = default;
static const std::vector<SomeType> vec;
public:
const std::vector<SomeType>& getVec() const { return vec; }
};
class DerivedClass : DerivedBase<DerivedClass>
{
};
现在每个DerivedClass
是,一个AbstractClass
通过强制执行这种设计的中介。 多亏了CRTP,每个DerivedClass
自动获得了自己的静态向量。
[1]为了简化代码,我省略了与正确性有关的重要细节,例如虚拟析构函数。 不要忘记他们。
如果您的成员函数的调用者遵守规则,那么public
此函数绝对没有危险。
他们也有可能const_cast
向量并开始对其进行修改。 如果您不信任用户,则需要切换到复制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.