C ++函数重载和动态绑定编译问题

时间:2010-04-22 05:09:06

标签: c++ inheritance overloading dynamic-binding

  

可能重复:
  C++ method only visible when object cast to base class?!
  Why does an overridden function in the derived class hide other overloads of the base class?

#include <iostream>

using namespace std;

class A
{
public:
    virtual void foo(void) const { cout << "A::foo(void)" << endl; }
    virtual void foo(int i) const { cout << i << endl; }
    virtual ~A() {}
};

class B : public A
{
public:
    void foo(int i) const { this->foo(); cout << i << endl; }
};

class C : public B
{
public:
    void foo(void) const { cout << "C::foo(void)" << endl; }
};


int main(int argc, char ** argv)
{
    C test;

    test.foo(45);

    return 0;
}

以上代码无法编译:

$>g++ test.cpp -o test.exe
test.cpp: In member function 'virtual void B::foo(int) const':
test.cpp:17: error: no matching function for call to 'B::foo() const'
test.cpp:17: note: candidates are: virtual void B::foo(int) const
test.cpp: In function 'int main(int, char**)':
test.cpp:31: error: no matching function for call to 'C::foo(int)'
test.cpp:23: note: candidates are: virtual void C::foo() const

如果方法“foo(void)”更改为“goo(void)”,则编译。为什么会这样?是否可以在不更改方法名称“foo(void)”的情况下编译代码?

感谢。

2 个答案:

答案 0 :(得分:0)

foo goo void int


我可能错了,但这可能就是问题所在:

  

阴影完全基于名称,完全不基于参数类型。编译器观察到derieved-class中有一个具有正确名称的函数,并且它停止查找。选择了一个上下文后,它会在derieved-class中查找适用的重载,但找不到,所以报告错误。

     

此处有更多详情
  C++ method only visible when object cast to base class?


C类有一个foo(无效

main()中使用:

test.foo(45);

您正在将 int 传递给 foo 功能,即使它是 foo(无效)
因此错误:

test.cpp: In function 'int main(int, char**)':  
test.cpp:31: error: nomatching function for call to'C::foo(int)'

我希望我有意义 是这个吗??评论任何人?? ...

答案 1 :(得分:0)

问题是,继承不是通过不同的命名空间进行的。因此,为了使其编译,您必须使用using指令告诉编译器:

class B : public A
{
public:
    using A::foo;
    void foo(int i) const { this->foo(); cout << i << endl; }
};

class C : public A
{
public:
    using B::foo;
    void foo(void) const { cout << "C::foo(void)" << endl; }
};