[英]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.