這是不可能改變的參數這樣,也不應該是因爲它一般會違反里氏替換原則(LSP ):根據定義,Aircraft::getImage
可接受任何GenericImage
,其包括GenericImage
的任意子類。子類必須符合該接口,因此也必須接受任何GenericImage
。但是,您明確要指定它只接受特定的子類型Image
。
注意,這種情況是返回類型不同,因爲這些代表事物的功能產生的而不是事物的功能接受(你會說你getImage
還生產,但C++不知道這個概念的輸出參數,並且確實必須將現有對象傳遞給getImage
才能將其填充圖像數據)。因爲對於返回類型,轉到派生類型不違反LSP,C++的確允許它(該特性稱爲協變返回類型)。因此,解決方案是在函數內部分配圖像對象並返回(最好使用指針 - 一個智能指針,不幸的是不能用於協變返回類型 - 指示發生的分配)。也就是說,你的函數會讀
class Aircraft
{
virtual GenericImage* getImage() = 0;
};
class Drone: public Aircraft
{
virtual Image* getImate() { return new Image(); }
};
但是很有可能你會只使用基類的接口,無論如何,所以我寧願只是在界面中GenericImage
去,而是利用智能指針:
class Aircraft
{
virtual std::unique_ptr<GenericImage> getImage() = 0;
};
class Drone: public Aircraft
{
virtual std::unique_ptr<GenericImage> getImate() { return new Image(); }
};
謝謝。這正是我正在尋找的。 – imjojo42 2012-01-11 00:05:07
@user:問題是,爲什麼你真的想在派生的飛機上使用派生圖像?爲什麼不只是在那裏返回'GenericImage'呢? – Xeo 2012-01-11 00:19:57
背後的原因是因爲每架飛機都有不同的圖像格式。因此,每架飛機都將擁有與該飛機相同的不同格式,但所有飛機都會有圖像。 – imjojo42 2012-01-11 00:27:56