1. 程式人生 > >c++與Java中繼承關係對成員訪問許可權的影響之比較

c++與Java中繼承關係對成員訪問許可權的影響之比較

c++中繼承關係對成員訪問許可權的影響:

c++中父類定義的public成員,在子類中可以被覆寫為private;同樣的,父類中的private成員,在子類中可以是public。程式判斷一個例項對

成員是否有訪問許可權時,根據該例項在形式上是父類還是子類,所謂形式上,是說由於多型,子類的例項可以付給父類的指標或飲用,但只根

據這個指標或引用的定義來判斷是否可以訪問成員。


class BaseClass
{
public:
 virtual void base_public_fn()
 {
  cout<<"In BaseClass::base_public_fn()---------public/n";  
 }
private:
 virtual void base_private_fn()
 {
  cout<<"In BaseClass::base_private_fn()--------private/n"; 
 }
};
class SubClass : public BaseClass
{
public:
 virtual void base_private_fn()
 {
  cout<<"In SubClass::base_private_fn()---------public/n";
 }
 
private:
 virtual void base_public_fn()
 {
  cout<<"In SubClass::base_public_fn()---------private/n";
 } 
 
};

void example1()
{
 BaseClass &ref_base = SubClass ();
 ref_base.base_public_fn();  //(1) 
 ref_base.base_private_fn();  //(2) error base_private_fn 在BaseClass中是private

 SubClass &ref_sub =(SubClass& )ref_base;
 ref_sub.base_public_fn();  //(3) error base_public_fn 在SubClass中是private
 ref_sub.base_private_fn();  //(4) 
}
這樣出現一個有趣的現象:在父類中定義為public,但被子類覆寫並定義為private的成員,通過子類例項沒法訪問,但卻可以通過父類引用或

指標訪問。如(1),實際執行的是SubClass中的base_public_fn,這個函式在SubClass中是private,卻可以通過父類的引用訪問。


Java中繼承關係對成員訪問許可權的影響:
我們再來看看Java中繼承關係對成員訪問許可權有那些影響,Java中限制了子類對父類成員許可權的縮小,即若父類成員被定義為public,子類不

能將其定義為private或protected,反之父類中被定義為private的成員,在子類中可以被定義為public,這樣就保證了若父類成員是可以訪問

的,則被子類overload的成員也可以被訪問。

class BaseClass
{
 public void base_public_fn(){}
 private void base_private_fn(){}
}

class SubClass extends BaseClass
{
 public void base_private_fn(){}
 private void base_public_fn(){} // error cannot reduce the visibility of the inherited method from base class
}

如上面例子中base_public_fn在父類中是public 在子類中不可以將其覆寫為private,而base_private_fn在父類中是private,在子類中可以

被覆寫為public。