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()
方法。