簡體   English   中英

如何通過將對象傳遞給另一個派生 class 來訪問其派生 class 的基礎 class 的受保護數據成員

[英]How to access protected data members of base class of its derived class by passing objects to another derive class

我已經查找了這個問題的一些答案並讓它工作,但我似乎無法理解這個答案是如何工作的,有人可以告訴我void show(input& obj){cout <<obj.*&output::x <<' ' <<obj.*&output::y <<endl;} 這是完整的代碼:

#include <iostream>
using namespace std;
class baseClass{
protected:
    int x, y;
public:
    virtual void func()=0;
};
class input:public baseClass{
public:
    void func(){
        cout <<"Enter value x and y respectively: ";
        cin >>x >>y;
        cout <<endl;
    }
};
class output:public baseClass{
public:
    void func(){}
    void show(input& obj){
        cout <<obj.*&output::x <<' ' <<obj.*&output::y <<endl;    /*Is this a reliable and effective
    }                                                              way of calling the protected data members?*/
};
int main(){
baseClass* ptr;
input callIn;
output callOut;
ptr=&callIn;
ptr->func();
callOut.show(callIn);
}

我正在嘗試通過將 object 傳遞給另一個子 class 來訪問從父基類繼承的輸入 class 的受保護數據成員。

該代碼是合法的,盡管復雜且不直觀。

魔術的要點發生在這里:

cout <<obj.*&output::x <<' ' <<obj.*&output::y <<endl;

這里, &output::x表示一個指向成員的指針,即output class 中的x 此操作是允許的,因為output具有baseClass作為其父級,因此可以訪問其受保護的成員。

現在您可以使用指向成員的指針訪問 class input中的成員,因為訪問控制不通過指向成員的指針來控制訪問(它們不能。)。 它們依賴於在獲取所述成員的地址期間調用的控制。

為了使代碼更清晰,可以使用局部變量來存儲指針:

   int baseClass::* p = &output::y;
   cout << obj.*p << endl; 

此外,雖然我發現這項技術值得理解,但我並不是在討論它是否適合使用。 通常,如果您不得不求助於這樣的魔術,您可能想要重新審視您的設計和 class 層次結構,但我不排除這方面的潛在用例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM