我们说我有B
类型的对象,并调用B.foo()
,其中foo()
是A
中定义的方法,尚未重新定义在B
。 A::foo()
有一行impl->foo()
。
当我们调用B.foo()时,是否使用A :: impl或B :: impl?
Scott Meyers'第3版有效C ++指南解释了与继承相关的隐藏概念,这样编译器检查本地命名空间,然后检查类命名空间,然后在层次结构中向上运行,但我不清楚这里发生了什么,我不知道&#39 ; t知道' initial'检查的名称空间是B
或A
的名称空间,因为该对象的类型为B
,但该方法位于A
的名称空间中。
我自己的测试似乎表明,当调用B.foo()
并执行A::foo()
时,它会查看impl
中的A
变量,而不是B
}。
class Aimpl;
class Bimpl;
struct A {
Aimpl* impl;
int foo();
};
struct B : public A{
Bimpl* impl;
};
struct Aimpl {
int foo(){
return -1;
}
};
int A::foo(){
return impl->foo();
}
struct Bimpl{
int foo(){
return 5;
}
};
int main()
{
B x;
x.foo();
}
答案 0 :(得分:0)
当我们致电
B.foo()
时,会使用A::impl
还是B::impl
?
它使用A::impl
。
调用x.foo()
时调用的是A::foo()
。
Bimpl* impl
中的B
指针会隐藏impl
中的A
,但会在foo
中调用A
继承类{{} 1 {}对B
不可见。