對於T
類型的對象,我有一堆有用的函數。這裏T
需要爲功能提供一些界面來處理它。有幾種常見的接口實現。所以我讓他們使用CRTP作爲mixin工作。防止意外隱藏(由CRTP mixin提供的方法)
template<class T>
struct InterfaceImpl {
using ImplType = InterfaceImpl<T>;
int foo();
...
};
struct MyData : public InterfaceImpl<MyData> {
...
};
template<class T>
void aUsefulFunction(T& t) {
//Working with `t`.
//This cast is to workaround an accidental hiding of `foo` by MyData.
static_cast<T::ImplType&>(t).foo();
}
我想提供的實施InterfaceImpl
(和其他的實現也),因爲它是有些道理的。隱藏他們的一些方法可能是非常危險的。他們有什麼辦法來強制孩子班級沒有壓倒一切?我在類似的問題上閱讀了link,但討論並未給出令人滿意的解決方案。如果沒有合理的方法,我期望在上面的代碼中的投射可以提供一些安全性。還是有其他解決方案來解決這個問題嗎?
您無法覆蓋非虛擬方法(可以將其隱藏在派生類中)。避免調用任何此類方法的唯一方法是接受基類實例或(如您所做的)將其轉換爲基類的類型。我將簡化上面的內容,並簡單地接受該方法中的任何'InterfaceImpl'而不是任何'T'。 –
Nim
@Nim有幾種不同的接口實現,我想避免運行時分派。因此指定參數類型是不可能的。 – jjdoe
順便說一句 - 我認爲這個問題有你需要的答案:https://stackoverflow.com/questions/4465686/how-to-prevent-a-method-from-being-overridden-in-derived-class,我會投票作爲副本關閉。如果不清楚,這是第二個答案(標記'虛擬'和'最終'的方法 - 如果任何人在派生類中實現該方法,這將導致編譯器錯誤。) – Nim