对基于访问说明符的特定重载函数使用声明
Using declaration for specific overloaded function based on access specifier
此代码
struct Foo{
void f(){
f(0);
}
private:
void f(int){}
};
struct Bar : private Foo{
using Foo::f;
};
int main() {
Bar b;
b.f();
}
编译失败,因为Foo::f(int)
private
。我对Foo::f(int)
不感兴趣,我只想要Foo::f()
public
,所以我觉得应该有办法做到。
我能想到一些解决方法:
- 将
Foo::f(int)
重命名为Foo::p_f(int)
,但这是多余的,并且不允许f
的过载解析 - 实现
Bar::foo(){Foo::f();}
成为多个public
f
的大量复制/粘贴 - 从邀请 UB 的
Foo
继承public
ly,因为~Foo()
不是virtual
(也不应该是) - 使所有
f
public
很容易意外破坏Foo
和Bar
有没有办法说using public Foo::f;
?或者使用其中一种没有相关缺点的解决方法?
如果你的f(int)
应该是private
的,并且永远不会成为公共API的一部分,那么你不应该关心将其重命名为fimpl
:
struct Foo{
void f(){
fimpl(0);
}
private:
void fimpl(int){}
};
另一方面,如果 f(int)
是公共 API 的通用版本,并且您还需要具有特定值的单个便利包装器,则可以使用 提供默认参数并使f(int)
成为public
成员。
struct Foo{
void f(int = 0){}
};
最后,如果你想要几个提供某些整数值的命名函数,那么我建议重命名这些包装器
struct Foo{
void f(int) {} // general interface
void sensible_name1() { f(0); }
void sensible_name2() { f(1); } // etc.
}
您的代码当前从Foo
派生Bar
作为private
。因此,Foo::f()
是Bar
中的私有方法。您可以通过将类声明更改为 struct Bar: public Foo
来更改它。
有关一些背景信息,请参阅派生类下的"私有继承"部分。具体而言,本节解释说:
当类使用私有成员访问说明符从基派生时,基类的所有公共成员和受保护成员都可以作为派生类的私有成员进行访问(除非与好友交朋友,否则永远无法访问基的私有成员)。
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 可以打印矢量和矢量中的矢量的非重载C++函数
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 使用模板重载函数
- C++线程中,没有重载函数接受 X 参数
- std::vector 没有重载函数的实例与参数列表匹配
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 对重载函数find_first_not_of的不明确调用
- 如何从重载解析中删除重载函数?
- CUDA:重载函数"isnan"的多个实例
- C++派生类重载函数(带有 std::function 参数)不可见
- 避免在人为的重载函数调用中拼写出类型
- C++:如何为多个重载函数保留通用代码路径?
- 什么时候可以使用常量装饰调用我的重载函数?
- 尝试使用谓词函数会导致错误:"std::sort"未找到匹配的重载函数
- std::调用,未找到匹配的重载函数
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 为什么使用不匹配的参数调用重载函数仍然有效
- 如何通过签名作为模板参数来解决重载函数?