为什么重写方法会隐藏所有具有相同名称的方法,而不管其参数如何

时间:2017-09-27 13:27:20

标签: c++ polymorphism

struct A{
        void foo(A a){}
        virtual void foo(int c=1){}
};
struct B : public A{
        void foo(int c){}
};

int main(){
        A* object = new B();
        object->foo();
        ((B*)(object))->foo(*object);
}

输出:

test_test.cpp: In function ‘int main()’:
test_test.cpp:14:36: error: no matching function for call to ‘B::foo(A&)’
         ((B*)(object))->foo(*object);
                                    ^
test_test.cpp:8:14: note: candidate: virtual void B::foo(int)
         void foo(int c){}
              ^
test_test.cpp:8:14: note:   no known conversion for argument 1 from ‘A’ to ‘int’

虽然我仍然能够通过((B*)object)->A::foo(*object)使用 A :: foo ,但我想听听它为什么会这样做的故事。

2 个答案:

答案 0 :(得分:3)

  

我想听听它背后的故事。

因为这是name lookup的规则。如果在当前范围内找到该名称(例如,类B),则名称查找停止,进一步的外部范围(例如,类A)不会被检查。名称查找过程不会考虑函数的参数,而只考虑名称。

根据找到的名称执行名称查找重载解析后,显示错误。

答案 1 :(得分:2)

简短的回答是'因为这就是规则所说的'。

你可以达到你想要的效果:

struct A{
        void foo(A a){}
        virtual void foo(int c=1){}
};
struct B : public A{
        using A::foo;
        void foo(int c){}
};

int main(){
        A* object = new B();
        object->foo();
        ((B*)(object))->foo(*object);
}