考虑
struct Base
{
int foo(int);
int foo(int, int);
};
struct Child : Base
{
using Base::foo;
int foo(int, int, int);
};
Run Code Online (Sandbox Code Playgroud)
理想的情况是我想要把Base类foo是只需要一个int作为参数到Child类,而不是需要2一int秒.有没有办法可以做到这一点?我的写作using Base::foo;带来了两种foo方法Base.
Sto*_*ica 27
使用声明将使所有重载都可用.你不能阻止这种情况发生.但是你可以delete在事后做出你不想要的重载:
struct Base
{
int foo(int);
int foo(int, int);
};
struct Child : Base
{
using Base::foo;
int foo(int, int) = delete;
int foo(int, int, int);
};
Run Code Online (Sandbox Code Playgroud)
现在使用带有a的两个int重载Child是不正确的.然而,这不是一个完美的解决方案,因为客户端仍然可以调用Base版本:
Child c;
c.Base::foo(0, 0);
Run Code Online (Sandbox Code Playgroud)
son*_*yao 10
无法将指定的重载函数带入派生类.名称查找规则处理名称,但重载的函数具有相同的名称foo.
您可以在派生类中编写包装函数,例如
struct Child : Base
{
int foo(int x) { return Base::foo(x); }
int foo(int, int, int);
};
Run Code Online (Sandbox Code Playgroud)
我将列出其他答案中提出的两种解决方案,并详细说明它们的不同之处.
struct Child : Base
{
int foo(int x) { return Base::foo(x); }
int foo(int, int, int) { std::cout << 3; return 33; }
};
Run Code Online (Sandbox Code Playgroud)
这完全符合您的要求,但您必须重复签名.
结果略有不同:
struct Child : Base
{
using Base::foo;
int foo(int,int)=delete;
int foo(int, int, int) { std::cout << 3; return 314; }
};
Run Code Online (Sandbox Code Playgroud)
要想看看它有何不同,想象一下我们这样做了:
struct Grandkid : Child
{
using Child::foo;
int foo(double, double) { std::cout << 2; return 42; }
};
Run Code Online (Sandbox Code Playgroud)
我们做到了:
Grandkid x;
x.foo(3,4);
Run Code Online (Sandbox Code Playgroud)
在这种情况下=delete,这将产生编译器错误.
3,4喜欢int,int过double,double.当我们=delete在int,int过载,它仍然被认为,选择和我们挑=deleted之一.当我们将其从重载分辨率中排除时,3,4选择double,double.
手动转发不包括 int,int被认为是超载. =delete才不是.
这与假想的语法最相似using Base::foo(int);(即,仅引入其中一个父重载foo).
请注意,这Grandkid只是检测差异的一种简单方法.重要的是从重载解析和过载中删除某些东西之间存在差异=delete.
| 归档时间: |
|
| 查看次数: |
1861 次 |
| 最近记录: |