【问题标题】:C++ 11 Implemented interface's method is not available. Why?C++ 11 实现接口的方法不可用。为什么?
【发布时间】:2016-02-13 12:36:01
【问题描述】:

我有一个特定的问题,在下面的示例中进行了描述。我的问题是第 34 行(注释的行):为什么这行给我错误消息?

test.cpp: In function ‘int main()’:
test.cpp:34:13: error: no matching function for call to ‘C::func(int)’
  c.func( 33 );  // Line 34
         ^
test.cpp:23:24: note: candidate: virtual void C::func(int, int)
  public : virtual void func( int x, int y ) override
                    ^
test.cpp:23:24: note:   candidate expects 2 arguments, 1 provided

C 类扩展 B 类,B 类实现方法 func(int)。但是为什么这种方法不可用呢?如果我将 C 转换为 A,为什么它可以使用?

#include <cstdio>


class A
{
    public : virtual void func( int x ) = 0;
};


class B : public A
{
    public : virtual void func( int x, int y ) = 0;

    public : virtual void func( int x ) override
    {
        func( x, 0 );
    }
};


class C : public B
{
    public : virtual void func( int x, int y ) override
    {
        printf( "x: %d y:%d\n", x, y );
    }
};


int main()
{
    C c;
    c.func( 4, 6 );     
    c.func( 33 );       // Line 34

    A* a = &c;
    a -> func( 33 );

    return 0;
}

【问题讨论】:

    标签: c++ c++11 interface


    【解决方案1】:

    这是范围的问题...在类C中定义了方法func,因此编译器显然不会尝试在上层类中查找方法的重载...给编译器一个提示哪种方法符合您的兴趣,您可以使用语法:

    c.B::func(33);
    

    您也可以尝试通过给这两个重载不同的名称来避免此问题...

    【讨论】:

      【解决方案2】:

      详细说明在此:https://isocpp.org/wiki/faq/strange-inheritance#hiding-rule

      在这种情况下,func 是否是虚拟的并不重要。事实是 C::func(int, int) 隐藏了 B::func(int) 而不是重载它。

      您需要将 B::func(int) 带回 C 的作用域,以便您可以将它与 C 对象的实例一起使用。这样,在 C 的范围内将有两个可用的重载。

      如果您的编译器支持使用:

      class C : public B
      {
          public :
          using B::func;
          virtual void func( int x, int y ) override
          {
              printf( "x: %d y:%d\n", x, y );
          }
      };
      

      如果你的编译器没有:

      class C : public B
      {
          public :
          virtual void func(int x) { B::func(x); }
          virtual void func( int x, int y ) override
          {
              printf( "x: %d y:%d\n", x, y );
          }
      };
      

      【讨论】:

        猜你喜欢
        • 2016-10-06
        • 2011-04-26
        • 1970-01-01
        • 2012-02-10
        • 1970-01-01
        • 1970-01-01
        • 2011-03-23
        • 2020-06-07
        相关资源
        最近更新 更多