2011-03-02 42 views
1

下面是小程序。 我想使用B類的對象來檢查類A的私有變量x的值。 有沒有可能?使用派生類對象檢查私有變量

#include<stdio.h> 
#include<conio.h> 
#include<iostream> 

class A { 
    int x; 
public: 
    A() { 
     x=10; 
    } 
}; 

class B : public A { 
public: 
    int x; 
}; 

int main() 
{ 
    B obj; 
    obj.x=20; 
    std::cout<< obj.x; 
    getch(); 
} 

這將輸出20,但我怎麼能檢查爲10 x的值,它是在class A? 我想知道我們是否可以在不將x設爲受保護的情況下檢查值!

+1

爲什麼不使用,比方說,一個受保護的訪問? – Beta

回答

1

派生類不能看到祖先私處。你可以使用「保護」爲後代來查看數據,但不是無關的類。

+0

我想知道我們是否可以檢查值未做x作爲保護! – Vijay

+0

不,私人的意思是私人的,沒有任何人在定義的階級之外可以看到它。同樣,受保護的整個*點*是派生類可以看到父項的成員,而沒有其他人可以。 – Bogatyr

2

您必須使變量受保護,或者,您可以在A類中創建一個受保護的成員方法,該方法返回變量x。

通過使用第二方法(保護構件的方法或屬性(是,可能在C++?),B類可以讀該變量,但不能改變它。

+0

使用C++進行保護可以完全訪問派生類。如果你想給派生類只讀訪問,那麼使用受保護的訪問方法。 – DanS

0

不能檢查的私有成員的值基類這樣:在一個在受保護的添加訪問或使A :: X保護

0

製作x和寫在B中的方法,看起來是這樣的:

int getAX(){ 
    return A::x 
} 
0

你不應該。

由於您的A課程告訴該成員是私密的,因此只有A才能訪問該成員。

如果B是-,則相同的規則有效:A::x仍然無法訪問。

你想訪問它意味着你要麼需要一種不同的A(即讓A::x公開),或你想要的錯誤的事情。

1

除了私有/保護問題,您B::x成員過色調Ax。所以即使兩者都是公開的,你必須寫b.A::x。看起來很奇怪,但工程(見下面的代碼)....

這是語法方面。當然,你應該這樣做,正如每個人在這裏所說的那樣。使用有意義的名稱protected成員,和存取功能

class A { 
public: 
    int x; 
}; 

class B: public A { 
public: 
    int x; 
    void f() { std::cout << "B::x=" << x << ", A::x=" << A::x << '\n'; } 
}; 

int main() 
{ 
    B b; 
    b.A::x = 10; 
    b.x = 20; 
    b.f(); 
} 

輸出:

B::x=20, A::x=10 
0

好吧,如果你真的想知道,如果有可能的:它是。 publicprotectedprivate只是編譯時間檢查。一個可能的選項,在運行過程中規避它們是:

#include <iostream> 
class A{ 
    int x; 
    A() : x(10){} 
}; 
struct pubA{ 
    int x; 
}; 

int main(){ 
    A a; 
    // evil casting 
    pubA* pa = reinterpret_cast<A*>(&a); 
    std::cout << pa->x << std::endl; // should print 10 
} 

也就是說,不這樣做。這些關鍵字有一個原因。 (上面的代碼沒有經過測試,'因爲我正在從我的iPod上寫下來,如果reinterpret_cast不起作用,請使用舊的C風格演員:pa = (pubA*)&a。)

相關問題