类的权限与继承

一共存在三种权限及继承方式:

  • public
  • protected
  • private

类内部权限
public的属性和方法是开放的,类的内部和外部都可以访问;
private的属性和方法是私有的,类的外部无法访问,子类也不可以访问,只有类的内部可以访问;
protected的属性和方法是受保护的,为类的派生类准备的,类的外部无法访问,只有类的内部和派生类可以访问。

类的继承权限
pulic继承,父类中的成员,所有权限完全一样的继承到子类中;
private继承,父类中的成员所有权限都在子类中变为private;
protected继承,父类中的成员,原先的public变为子类的protect,原先的protect保持不变,原先的private保持不变。

Note

  1. 子类无法直接访问父类的私有属性和方法,只能通过父类提供的方法来访问。

子类继承父类时会继承父类的所有成员(构造函数除外),包括私有成员,但是不能访问。
可以想象为父亲有个盒子,里面有个秘密,但是盒子是锁着的,只有父亲的指纹才能打开。父亲去世了,盒子给了儿子,但是儿子打不开。
(这样设计可以是将我们的成员保护得更好,可以让子类的设计者只能通过父类的指定方法修改父亲的私有成员,这样把类保护得更好。

  1. private 继承不影响派生类成员(及友元)对基类成员的访问,只是控制派生类用户(实际对象)对于基类成员的访问权限。同时也影响继承自派生类的新类访问权限。
class Base {
    friend class Pal;
public:
    void pub_mem();
protected:
    int prot_mem;
private:
    char priv_mem;
};

struct Pub_Derv : public Base {
    int f() {return prot_mem;} // OK, prot_mem can be access by derived class
    char g() {return priv_mem;} // error, private member cannot be access by derived class
};

struct Priv_Derv : private Base {
    int f1() {return prot_mem;} // OK, private derived have no influence to access it in derived class
};

Pub_Derv d1;
Priv_Derv d2;
d1.pub_mem(); // OK, public method
d2.pub_mem(); // the method is private in derived class

struct Derived_from_Private : public Priv_Derv{
    int use_base() {return prot_mem;} // prot_mem is private in Priv_Derv
};

class Sneaky : public Base {
    int j;
};

class Pal {
public:
    int f(Base b) {return b.prot_mem;} // OK
    int f2(Sneaky s) {return s.j;} // error, Pal is not Sneaky's friend
    int f3(Sneaky s) {return s.prot_mem;} // OK, the prot_mem is a Base part of derived class Sneaky
};
  1. 基类的友元不能访问派生类,同样派生类的友元也不能访问基类成员。
    基类的友元可以访问派生类的基类部分。友元关系不可以传递,也不可以继承。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值