派生类无法访问私有成员

Derived Classes Cannot Access Private Members

本文关键字:成员 访问 派生      更新时间:2023-10-16

在C++中:
概念是派生类对象,成员函数不能访问父类的私有成员。但是,如果Parent类的公共成员函数返回私有变量的引用,并且Parent类在子类中被公开继承,并且子类有一个函数(在本例中为display()),该函数从父类调用函数(在此例中为show())并取用私有变量x的引用,该怎么办。a的地址应该与x匹配,但我不知道为什么它不同?

enter code here
#include <iostream>
using namespace std;
class test{
int x=10;
public:
int & show();
};
class ChildTest: public test{
public:
void display(){
int a=show();
cout<<&a<<endl;
}
};
int & test::show(){
cout<<&x<<endl; //so this address should match the above address but it //is not matching I don't understand why?
return x;
}
int main()
{
ChildTest obj;
obj.display();
return 0;
}

输出:
0x7ffe5b751bb0
0x7ffe5B 751bb4

我不明白地址更改背后的概念是什么,因为我正在传递对私有变量的引用。

这里只显示局部变量a(其值为test::x)的地址

更改为int& a=show();以显示相同的地址。

当您编写时

int a = show();

您说"创建一个名为a的全新整数变量,并使用show()的返回值对其进行初始化。即使show返回int &,由于您明确表示"我想要一个新的int",C++也会创建存储在int中的值的副本,该值由show()的返回引用。

要解决此问题,请将代码更改为读取

int& a = show();

这意味着"创建一个新的int引用,并将其绑定到show()返回的引用所指的任何内容。"这样,就不会复制整数,并且您应该看到相同的地址

请注意,这与继承无关。它纯粹是复制int而不是存储引用的功能。

Integer是一个值。例如,如果使用自定义类而不是整数,则会得到相同的地址。然而,作为一种值类型,所有Integer变量在内存中都有自己独立的空间。若要具有相同的地址,应将变量a更改为指向整数值的指针:

void display() {
int* a=show();
cout<<a<<endl;
}

有了这个改变,地址应该是一样的。请注意,我删除了输出中的&。这是因为变量a现在指向该值的地址。要使用该值,请使用*a进行调用。

来源(https://www.cprogramming.com/tutorial/lesson6.html):

指向某些东西:检索地址

为了让指针真正指向另一个变量也需要有该变量的内存地址。获取变量的内存地址(其在内存中的位置),将&签名在变量名前面。这使得它给出了地址。这是称为运算符的地址,因为它返回内存地址。方便的是,"与"answers"地址"都以a开头;那是一个记住你使用&获取变量

例如:

#include <iostream>
using namespace std;
int main() {
int x;    // A normal integer   
int *p;   // A pointer to an integer
p = &x;           // Read it, "assign the address of x to p"   
cin>>x;          // Put a value in x, we could also use *p here  
cin.ignore();   
cout<< *p <<"n"; // Note the use of the * to get the value  
cin.get(); 
}

编辑:我写这篇文章的时候有一个错误,别人回答了。