在C ++中,是否有可能既有static和又有成員函數virtual?顯然,沒有一種簡單的方法(static virtual member();編譯錯誤),但是至少有一種方法可以達到相同的效果嗎?IE瀏覽器:struct Object{ struct TypeInformation; static virtual const TypeInformation &GetTypeInformation() const;};struct SomeObject : public Object{ static virtual const TypeInformation &GetTypeInformation() const;};這是有道理的使用GetTypeInformation()上的一個實例(都object->GetTypeInformation())和一類(SomeObject::GetTypeInformation()),它可以為模板,比較有用和重要。我能想到的唯一方法是針對每個類編寫兩個函數/一個函數和一個常量,或者使用宏。還有其他解決方案嗎?
3 回答

qq_遁去的一_1
TA貢獻1725條經驗 獲得超8個贊
不,沒有辦法,因為打電話時會發生什么Object::GetTypeInformation()
?它不知道要調用哪個派生類版本,因為沒有與之關聯的對象。
您必須使其成為一個非靜態虛擬函數才能正常工作。如果您還希望能夠在沒有對象實例的情況下非虛擬地調用特定派生類的版本,則還必須提供第二個冗余的靜態非虛擬版本。

慕姐8265434
TA貢獻1813條經驗 獲得超2個贊
許多人說這是不可能的,我會更進一步,說這沒有意義。
靜態成員是僅與類無關的任何實例。
虛擬成員是不與任何類直接相關,而僅與實例直接相關的東西。
因此,靜態虛擬成員將與任何實例或任何類都不相關。

Smart貓小萌
TA貢獻1911條經驗 獲得超7個贊
前幾天,我遇到了這個問題:我有一些充滿靜態方法的類,但我想使用繼承和虛擬方法并減少代碼重復。我的解決方案是:
代替使用靜態方法,將單例與虛擬方法一起使用。
換句話說,每個類都應包含一個靜態方法,您可以調用該方法來獲取指向該類的單個共享實例的指針。您可以將真正的構造函數設為私有或受保護的,以便外部代碼不會通過創建其他實例來濫用它。
實際上,使用單例與使用靜態方法非常相似,不同之處在于可以利用繼承和虛擬方法。
- 3 回答
- 0 關注
- 521 瀏覽
添加回答
舉報
0/150
提交
取消