class訪問許可權
1. C++的類和C裡面的struct有什麼區別
C++中的class和C語言中的struct在使用上有顯著的區別。首先,class中的成員默認訪問許可權是私有的,而struct中的成員默認訪問許可權是公有的。這意味著在class定義中,除非特別聲明為公有或保護,否則成員變數和方法默認是私有的,只有class內部可以訪問它們。而在struct中,除非特別聲明為私有或保護,否則成員默認可以被外部訪問。
其次,class和struct在繼承方面的默認方式也有所不同。class的默認繼承方式是私有繼承,這意味著子類只能訪問基類中公有的成員,而struct的默認繼承方式是公有繼承,這樣子類可以訪問基類中的所有成員,包括私有的。
此外,C++中的類還支持虛函數和虛函數表,這是C語言的struct所不具備的。虛函數和虛函數表使得類可以實現多態性,這是面向對象編程中一個非常重要的特性。虛函數表是一種特殊的數組,用於存儲指向虛函數的指針,它使得通過基類指針或引用可以調用派生類的虛函數。
總之,雖然C++中的class和C語言中的struct都用於封裝數據,但它們在默認訪問許可權、默認繼承方式以及面向對象特性支持等方面存在差異。對於更深入的理解,建議查閱現代編譯原理的相關資料。
2. java 的class 為什麼不可以是protected訪問許可權
1. protected 訪問控制符能被用於方法和成員變數。
2. 聲明為protected的方法和成員變數能被同一個包里的所有類所訪問,就像默認修飾符package一樣。
3. 能被該類的子類所訪問,子類可以和父類不在一個包中。
這樣,當你想讓一個類中的某個方法或成員變數在包中都可見,而且其子類也能訪問(子類有可能和父類不在同一個包中)但又不想讓所有類都可以訪問該類時,就可以用protected修飾符。
可訪問性: public > protected > package >private
注意:
4. But a subclass in another package can access the protected members in the super-class via only the references of subclass or its subclasses. A subclass in the same package doesn』t have this restriction. This ensures that classes from other packages are accessing only the members that are part of their inheritance hierarchy.
但是位於與父類不同包中的一個子類,能夠使用其父類中protected成員的途徑只能是,使用子類(或者是子類的子類)的引用。子類和父類在同一個包中則沒有這個限制。這樣就保證了其他包中的類只能訪問它們所繼承的部分成員。
下面的例子可以說明上述幾點:(特別注意第4點)
1 創建一個父類Bird.java,放在birdpack包中,父類中有一個protected int的成員變數nFeathers:
package birdpack; public class Bird { protected int nFeathers; }
2 創建Bird的一個子類Duck1.java,放在ckpack包中,這個程序說明在子類中直接使用父類的protected變數是可以的,父類的protected許可權的成員變數可以被子類繼承:
package ckpack; import birdpack.Bird; public class Duck1 extends Bird { public void setn(int ck1n) { nFeathers = ck1n; } }
3 創建Bird的一個子類Duck2.java,放在ckpack包中,這個程序說明在子類中通過子類的對象訪問父類的protected成員是可以的:
package ckpack; import birdpack.Bird; public class Duck2 extends Bird { public void constructor(int newDuck2) { Duck2 d2 = new Duck2(); //在子類中通過子類的對象訪問父類中的protected變數 d2.nFeathers = newDuck2; } }
4 創建Bird的一個子類Duck3.java,放在ckpack包中,這個程序說明在子類中使用父類的對象訪問父類的protected成員反而是不行的:
package ckpack; import birdpack.Bird; public class Duck3 extends Bird { public void constructor(int newDuck3) { Bird b = new Bird(); //子類中用父類對象反而不能訪問父類中的protected變數 //b.nFeathers = newDuck3; } }
5 創建Bird的一個子類Swan.java,放在ckpack包中,這個程序說明在子類中使用其他子類的對象訪問父類的protected成員也是不行的:
package ckpack; import birdpack.Bird; public class Swan extends Bird { public void constructor(int swan) { Duck1 d1 = new Duck1(); //子類中用另外一個子類的對象也不能訪問父類中的protected變數 //d1.nFeathers = swan; } }
-------------------------------------------------------------------------------------------------------------------------------
轉載這篇文章,主要是為了說明,雖然在java中,父類中protected許可權的成員變數可以被子類訪問,但是還是有條件的,具體如下:
1.在子類中直接使用父類的protected變數是可以的,父類的protected許可權的成員變數可以被子類繼承
2.在子類中通過子類的對象訪問父類的protected成員是可以的
3.在子類中使用父類的對象訪問父類的protected成員反而是不行的
4.在子類中使用其他子類的對象訪問父類的protected成員也是不行的