C++ pImpl、范围和隐藏数据成员
假设我有一个类型为C++ pImpl、范围和隐藏数据成员,c++,C++,假设我有一个类型为B的对象,并调用B.foo(),其中foo()是a中定义的方法,在B中没有重新定义A::foo()有一行impl->foo() 当我们调用B.foo()时,它是使用A::impl还是B::impl? Scott Meyers的第三版《有效C++指南》解释了与继承相关的隐藏概念,这样编译器就可以检查本地命名空间,然后类名命名空间,然后在层次结构上工作,但我不清楚这里会发生什么,我不知道检查的“初始”命名空间是B还是A,因为对象的类型是B,但方法在A的命名空间中 我自己的测试似乎
B
的对象,并调用B.foo()
,其中foo()
是a
中定义的方法,在B
中没有重新定义A::foo()
有一行impl->foo()
当我们调用B.foo()时,它是使用A::impl还是B::impl?
Scott Meyers的第三版《有效C++指南》解释了与继承相关的隐藏概念,这样编译器就可以检查本地命名空间,然后类名命名空间,然后在层次结构上工作,但我不清楚这里会发生什么,我不知道检查的“初始”命名空间是
B
还是A
,因为对象的类型是B
,但方法在A
的命名空间中
我自己的测试似乎表明,当调用B.foo()
并执行A::foo()
时,它查看A
中的impl
变量,而不是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();
}
当我们调用B.foo()
时,它是使用A::impl
还是B::impl
它使用A::impl
调用
x.foo()
时,调用的是A::foo()
B
中的Bimpl*impl
指针确实隐藏了A
中的impl
,但在A
中调用foo
时,继承类B
对A
不可见 这是个不错的问题,但是一些代码示例会让问题更容易回答。用代码来表达问题通常比写大量关于代码的段落要好得多。这里有很多文本需要吸收,但我认为它对于所讨论的函数的性质还不够具体。这是一个static
方法吗?我已经添加了一些代码,请告诉我是否有任何其他必要的澄清,并提前感谢您花时间考虑这个问题。正如您的测试所示,a::impl
将用于a::foo
。您的B
类没有foo()
方法(虽然它有一个指针impl
,但从未初始化,指向一个类类型Bimpl
,该类类型确实有foo())。因此,当执行x.foo()
时x
使用其父类a::foo()
方法。