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。