2009-06-08 33 views
11

我沒有做過C++中的一段時間,想不通爲什麼下不工作:爲什麼我無法從派生類的實例訪問受保護的成員?

class A { 
protected: 
    int num; 
}; 

class B : public A { 
}; 

main() { 
    B * bclass = new B(); 
    bclass->num = 1; 
} 

編譯這將產生:

錯誤C2248: 'A :: NUM' :不能訪問在類'A'中聲明的受保護成員

受保護的成員不應該被派生類訪問嗎?

我錯過了什麼?

回答

31

yes受保護的成員可以通過派生類訪問,但是您在main()函數中訪問該函數,該函數位於層次結構之外。如果你在類B中聲明一個方法並且訪問num,那就沒問題。

+0

謝謝!我現在看到我的錯誤 – 2009-06-08 22:41:27

13

是的,受保護的成員可以由派生類訪問,但只能在類中訪問。

例如:

#include <iostream> 

class A { 
    protected: 
    int num; 
}; 

class B : public A { public: 
    void printNum(){ 
     std::cout << num << std::endl; 
    } 

}; 

main() { 
    B * bclass = new B(); 
    bclass->printNum(); 
} 

將打印出的num值,但是numB類內訪問。 num必須公開才能以bclass->num的身份訪問它。

8

它可以在B函數的範圍內訪問,但是您正試圖在主函數中訪問它。

6

但是你沒有從派生類訪問它。你正在從main()訪問它。

3

「受保護」是指在成員函數或派生類的成員函數之外受到訪問。 「main」函數不是任何一個類的成員,但它試圖直接訪問成員變量。

4

當使用一個類時,保護和私有成員之間確實沒有區別。任何利用課堂的東西都不能訪問。

class A { 
    private: int privateNum; 

    protected: int protectedNum; 

    public: int publicNum; 

    void SetNumbers(int num) { 
     privateNum = num; //valid, private member can be accessed in member function 
     protectedNum = num; //valid, protected member can be accessed in member function 
} 

void main() { 
    A classA; 
    classA.privateNum = 1; //compile error can't access private member 
    classA.protectedNum = 1; //compile error can't access protected member 
    classA.publicNum = 1; //this is OK 
    classA.SetNumbers(1); //this sets the members not accessible directly 
} 

當您從具有受保護成員的類繼承時,差異生效。

class B : public A { 
} 

基類的所有私有成員仍然是私有的,並且不會被派生類訪問。另一方面,受保護的成員可以被繼承類訪問,但仍然不能在繼承類之外訪問。

class B : public A { 
public: 
    void SetBNumbers(int num) { 
     privateNum = num; //compile error, privateNum can only be accessed by members of A, not B 
     protectedNum = num; //this works, as protected members can be accessed by A and B 
    } 
} 

void main() { 
    B classB; 
    classB.publicNum = 1; //valid, inherited public is still public 
    classB.protectedNum = 1; //compile error, can't access protected member 
    classB.privateNum = 1; //compile error, B doesn't know that privateNum exists 
    classB.SetBNumbers(1); //this sets the members not accessible directly 
} 
0

是的,你不能訪問受保護的數據成員在主function.But您可以通過在派生呼叫建立功能訪問主受保護的數據成員。

+0

這個問題沒有足夠的答案嗎? – matsjoyce 2014-10-10 11:36:46

相關問題