pImpl,范围和隐藏数据成员

时间:2018-04-30 17:15:01

标签: c++

我们说我有B类型的对象,并调用B.foo(),其中foo()A中定义的方法,尚未重新定义在BA::foo()有一行impl->foo()

当我们调用B.foo()时,是否使用A :: impl或B :: impl?

Scott Meyers'第3版有效C ++指南解释了与继承相关的隐藏概念,这样编译器检查本地命名空间,然后检查类命名空间,然后在层次结构中向上运行,但我不清楚这里发生了什么,我不知道&#39 ; t知道' initial'检查的名称空间是BA的名称空间,因为该对象的类型为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();
}

1 个答案:

答案 0 :(得分:0)

  

当我们致电B.foo()时,会使用A::impl还是B::impl

它使用A::impl

调用x.foo()时调用的是A::foo()

Bimpl* impl中的B指针会隐藏impl中的A,但会在foo中调用A继承类{{} 1 {}对B不可见。