[英]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.