此代碼使用聲明特定重載函數
struct Foo{
void f(){
f(0);
}
private:
void f(int){}
};
struct Bar : private Foo{
using Foo::f;
};
int main() {
Bar b;
b.f();
}
fails to compile因爲Foo::f(int)
是private
。我對Foo::f(int)
不感興趣,我只是想Foo::f()
這是public
,所以我覺得應該有辦法做到這一點。
有一些解決方法,我能想到的:
- 重命名
Foo::f(int)
到Foo::p_f(int)
,但這是多餘的,不允許超載分辨率爲f
- 實施
Bar::foo(){Foo::f();}
成爲很多複製/粘貼多個public
f
s - 繼承
public
ly從Foo
邀請UB,因爲~Foo()
不是virtual
(並且不是s upposed是) - 使所有
f
小號public
使得它太容易不小心打破Foo
和Bar
有沒有辦法說using public Foo::f;
?或者使用其中一個解決方法,而沒有相關的缺點?
沒有在基類中的虛擬析構函數不是自動UB。如果你有一個實際指向(或引用)子類實例的基類的指針(或引用),並且你銷燬該實例,那只有UB。在你顯示的(不可否認的簡單)代碼中,沒有公共繼承的UB。 –
這些具有相同的名字實際上是一個壞主意,它的原因包括這個使用聲明混亂。我建議閱讀關於「非虛擬接口」,這也有助於減少這種混亂。 –
爲什麼不讓'Foo :: f(int)'爲受保護的方法?任何使用'Bar'或'Foo'的代碼仍然只能訪問'Foo :: f(void)',所以接口是一致的。 – Archimaredes