【发布时间】:2021-04-16 00:06:55
【问题描述】:
我们知道,派生类public 和protected 成员的直接或间接基类在派生类中可用。
所以我有这个例子:
struct Foo{int x_ = 10;};
struct Bar : Foo{};
struct FooBar : Bar{
void f()const{
std::cout << &x_ << " : " << x_ << '\n';
std::cout << &Foo::x_ << " : " << Foo::x_ << '\n';
std::cout << &Bar::x_ << " : " << Bar::x_ << '\n';
std::cout << &FooBar::x_ << " : " << FooBar::x_ << '\n';
}
};
int main(){
FooBar fb{};
fb.f();
}
-
当我编译并运行程序时,我得到了输出:
0x7ffc2f7ca878 : 10 1 : 10 1 : 10 1 : 10
那么为什么通过完全限定名称访问成员数据A::x_ 的地址会产生“无效”地址?但是直接访问它(不合格的查找)是可以的。
-
我的程序是否处于未定义行为?
-
我已经使用 GCC 和 CLANG 编译了我的程序。
【问题讨论】:
-
您能否明确说明您对哪些输出感到困惑?另外,
A::x_是什么? -
@cigien 为什么我从 &Foo::x_ 、 &Bar::x_ 和 &Bar::x_ 得到 1 : 1?
-
不相关,
std::cout << &Foo::x_ << " : " << &Foo::x_ << '\n';中的第二个&Foo::x_应该是Foo::x_吗?
标签: c++ memory-address