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。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值