可以說我有一個抽象的基類,它帶有一個返回昂貴對象的純虛函數。由於它是一個昂貴的對象,我應該返回一個參考。C++協方差和引用
但是生活並不那麼簡單,比方說我有兩個從它派生出來的類:一個具有經常調用的函數,因此在實例中存儲一個副本並返回一個引用會更有效。另一個很少被調用,所以最好根據需要創建對象來保存RAM。
我以爲我可以使用協變,因爲Liskov替代原則會很開心,但當然Obj
不是Obj&
的子類型,所以會導致編譯錯誤。在
class abc
{
public:
virtual BigObj& obj() = 0;
};
class derived : public abc
{
public:
...
virtual BigObj obj() { return obj_; }
private:
BigObj obj_;
};
結果:
conflicting return type specified for ‘virtual BigObj derived::obj()’
是否有一個更優雅的解決方案,這不是簡單地挑選至少最糟糕的?
簡單的答案是*你不想這樣做*。你可能會認爲你想要這個,但是你並不想這麼做。返回值或引用的語義變化太大,不能從用戶代碼中隱藏*。 –