将基类方法引入子类是否有一种不那么直率的方法?

Seb*_*ard 13 c++ c++11

考虑

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)

理想的情况是我想要把Basefoo是只需要一个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)

  • 请注意,`= delete`不会阻止重载解析查找`foo(int,int)`,如果选择了它就会使它成为错误.这与"仅使用一个参数`foo`"不同. (7认同)

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)

  • 我喜欢这个答案.在生产代码中阅读此内容的人不会使用"罕见的语法",并且必须停下来思考当通用语法非常容易拼出时它意味着什么. (2认同)

Yak*_*ont 5

我将列出其他答案中提出的两种解决方案,并详细说明它们的不同之处.

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,intdouble,double.当我们=deleteint,int过载,它仍然被认为,选择和我们挑=deleted之一.当我们将其从重载分辨率中排除时,3,4选择double,double.

手动转发不包括 int,int被认为是超载. =delete才不是.

这与假想的语法最相似using Base::foo(int);(即,仅引入其中一个父重载foo).

请注意,这Grandkid只是检测差异的一种简单方法.重要的是从重载解析和过载中删除某些东西之间存在差异=delete.

它工作的实例工作的例子.