此代码使用声明特定重载函数
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