gpt4 book ai didi

c++ - pImpl、作用域和隐藏数据成员

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:41:11 27 4
gpt4 key购买 nike

假设我有一个 B 类型的对象,并调用 B.foo(),其中 foo() 是定义的方法在 A 中并且尚未在 B 中重新定义。 A::foo()impl->foo() 行。

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

Scott Meyers 的 3rd Edition Guide to Effective C++ 解释了与继承相关的隐藏概念,这样编译器会检查本地命名空间,然后是类命名空间,然后在层次结构中向上移动,但我不清楚这里发生了什么,我不知道检查的“初始”命名空间是 B 还是 A,因为对象的类型是 B 但方法在 A 的命名空间中。

我自己的测试似乎表明,当调用 B.foo() 并执行 A::foo() 时,它会查看 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();
}

最佳答案

When we call B.foo(), does it use A::impl or B::impl?

它使用A::impl


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

B 中的 Bimpl* impl 指针确实隐藏了 A 中的 impl,但是当调用 A 中的 >foo 继承类 BA 不可见。

关于c++ - pImpl、作用域和隐藏数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50105209/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com