一共存在三种权限及继承方式:
- public
- protected
- private
类内部权限:
public的属性和方法是开放的,类的内部和外部都可以访问;
private的属性和方法是私有的,类的外部无法访问,子类也不可以访问,只有类的内部可以访问;
protected的属性和方法是受保护的,为类的派生类准备的,类的外部无法访问,只有类的内部和派生类可以访问。
类的继承权限:
pulic继承,父类中的成员,所有权限完全一样的继承到子类中;
private继承,父类中的成员所有权限都在子类中变为private;
protected继承,父类中的成员,原先的public变为子类的protect,原先的protect保持不变,原先的private保持不变。
Note:
- 子类无法直接访问父类的私有属性和方法,只能通过父类提供的方法来访问。
子类继承父类时会继承父类的所有成员(构造函数除外),包括私有成员,但是不能访问。
可以想象为父亲有个盒子,里面有个秘密,但是盒子是锁着的,只有父亲的指纹才能打开。父亲去世了,盒子给了儿子,但是儿子打不开。
(这样设计可以是将我们的成员保护得更好,可以让子类的设计者只能通过父类的指定方法修改父亲的私有成员,这样把类保护得更好。
- 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
};
- 基类的友元不能访问派生类,同样派生类的友元也不能访问基类成员。
基类的友元可以访问派生类的基类部分。友元关系不可以传递,也不可以继承。