派生类无法访问私有成员
Derived Classes Cannot Access Private Members
在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(); }
编辑:我写这篇文章的时候有一个错误,别人回答了。
- 这是关于成员访问规则的正确摘要吗
- 为什么我在空指针错误(链表)中获取成员访问权限
- 成员访问是否在空指针上定义C++?
- C++ IDE 不会推断/自动完成对模板类中的 std::array 下标表达式的成员访问
- 为什么类成员数据必须是静态的才能被模板化类的模板化结构成员访问
- 为什么c++允许成员函数定义中实例的私有成员访问
- C/C++ 包含点的宏参数(成员访问运算符)
- 访问说明符(私有/公共/受保护)如何在内部工作(限制成员访问)?
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 内部类私有成员访问和封闭的友好性
- 通过 C++ 中的另一个结构成员访问结构
- 具体化 PRVALUES 成员访问的 decltype 行为不正确
- 常量表达式中的静态成员访问
- XVALUE来自类成员访问表达式
- 未经授权的私有类成员访问会产生编译时错误而不是运行时错误?
- 在 c++ 中,为什么 -> 被称为二进制中缀指针成员访问运算符?
- 如何访问模板参数的成员?“成员访问不完整的类型”
- 不明确的可变参数类成员访问
- C 受保护的成员访问
- 将typeID转换为静态成员访问(C )的命名空间