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 ,但我想听听它为什么会这样做的故事。
答案 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);
}