【问题标题】:Cannot find baseclass function if baseclass has two functions of same name如果基类有两个同名函数,则找不到基类函数
【发布时间】:2011-06-12 03:04:39
【问题描述】:

我有一个基类,它具有两个同名但在 2 级继承中具有不同签名的函数。

struct A {
    virtual void f(int) { }
    virtual void f(int, int) { };
    virtual void f1(int) { }
};

struct B: public A { };

struct C: public B {
  void f(int, int) { }
  void f1(int) { }
};

int main() {
 C obj;
 obj.f1(0);
 obj.f(0,0);

 obj.f(0);    // (1) cannot be found
 obj.B::f(0); // (2) works

}

我希望我的编译器 (gcc-4.3.2) 在 (1) 找到正确的定义,但我明白了

g++     main.cpp   -o main
main.cpp: In function 'int main()':
main.cpp:20: error: no matching function for call to 'C::f(int)'
main.cpp:10: note: candidates are: virtual void C::f(int, int)
distcc[2200] ERROR: compile main.cpp on localhost failed
make: *** [main] Error 1

另一方面,(2) 有效。

我需要解决什么问题才能使(1) 正常工作?

【问题讨论】:

  • +1 写好文章并附上完整示例

标签: c++ inheritance


【解决方案1】:

在 C 的定义中写入using A::f

您是隐藏姓名的受害者! void C::f(int, int) 隐藏void A::f(int),只是因为。

【讨论】:

    【解决方案2】:

    C++ 名称查找规则有它,因此如果在一个范围内重新定义名称,则该名称的所有重载都将被隐藏。

    但是您可以使用using 来提供帮助。像这样:

    class A {
        public:
        int f(int x) { cout << "A::f 1\n"; }
        int f(int x, int y) { cout << "A::f 2\n"; }
    };
    
    class B : public A {
        public:
        using A::f;
        int f(int x) { cout << "B::f 1\n"; }
    };
    
    int main()
    {
        B b;
    
        b.f(27, 34);
    
        return 0;
    }
    

    输出是:

    A::f 2
    

    【讨论】:

      【解决方案3】:

      “为什么”的简短回答是“因为这就是重载的工作原理”。您在 C 中隐藏了 f(int) 重载。更长的答案更长。

      您可以通过这样做来取消隐藏它:

      struct C: public B {
        using A::f;
        void f(int, int) { }
        void f1(int) { }
      };
      

      【讨论】:

      • 你能告诉我们更长的答案吗?
      • @honk:现在不行,我没时间了。但我会为此寻求一些帮助。
      • 时间不长,这里解释一下:stackoverflow.com/questions/888235/…
      • 谢谢@Fred Larson,我应该已经找到了。
      • @John:永远不要让回答妨碍啤酒点钟,对吧? :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 1970-01-01
      相关资源
      最近更新 更多