派生类无法访问私有成员

时间:2017-11-07 01:14:55

标签: c++ inheritance reference

在C ++中:
概念是派生类对象,而成员函数不能访问父类的私有成员。但是,如果Parent类的公共成员函数返回私有变量的引用并且Parent类在子类中公开继承并且子类具有从父类调用该函数的函数(在本例中为display()),该怎么办? class(在本例中为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
0x7ffe5b751bb4

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

写作时

int a = show();

你说&#34;创建一个名为a的全新整数变量,并使用show()的返回值对其进行初始化。即使show返回int &,因为您已明确说过&#34;我想要一个新的int,&#34; C ++创建存储在int返回引用的show()中的值的副本。

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

int& a = show();

这表示&#34;创建一个新的int引用,并将其绑定到show()返回的引用所引用的内容。&#34;这样,就没有整数副本,你应该看到相同的地址

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

答案 2 :(得分:0)

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

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

通过该更改,地址应该相同。请注意我删除了输出中的&。那是因为变量a现在指向值的地址。要使用该值,请使用*a

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

  

指向某事:检索地址

     

为了让指针实际指向另一个变量   必须具有该变量的内存地址。得到的   一个变量的内存地址(它在内存中的位置),把&amp;标志   在变量名称前面。这使它给出了它的地址。这是   调用address-of运算符,因为它返回内存地址。   方便地,两个&符号和地址 - 以a开头;那是一个   有用的方法来记住你使用&amp;得到一个地址   变量。

     

例如:

   #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(); 
   }

编辑:在写这篇文章的时候有一个错误,还有其他人回答。