为了更好说明,首先定义一个基类如下,里面包含三种不同访问类型的成员函数
一)public派生说明符:基类的访问权限不会改变
class Base{
public:
void pub_mem() {}
protected:
void prot_mem() {}
protected:
void priv_mem() {}
};
①派生类成员或友元可访问基类受保护成员,但只能通过派生类访问;
struct Derv:public Base{
//1.通过友元友元
friend void func(Derv &d)
{ d.prot_mem(); }
//2.通过成员函数
void func() {prot_mem();} //相当于this->prot_mem();
//3.派生类的成员或友元中不能通过基类访问受保护成员
friend void func(Base &b) { b.prot_mem(); } //错误:不能通过基类访问
};
②受保护的成员对于类的用户是不可访问的,
注意:上题错误,相当于在类用户访问受保护类如下
int main() {
Base b;
b.prot_mem(); //错误
b.priv_mem(); //错误
b.pub_mem(); //正确
}
③派生访问说明符对于派生类成员及友元访问
直接基类
没有影响
//示例中,Pub_Derv,Prot_Derv,Priv_Derv都能访问prot_mem(),但均不能访问priv_mem();
struct Pub_Derv:public Base{
int f() {prot_mem();} //正确
int g() {priv_mem();} //错误
};
struct Prot_Derv: protected Base{
int f() {prot_mem();} //正确
int g() {priv_mem();} //错误
};
struct Priv_Derv: private Base{
int f() {prot_mem();} //正确
int g() {priv_mem();} //错误
};
④派生访问说明符目的是控制派生类用户(包括【派生类的派生类】)对基类成员的访问权限
一)public派生说明符:基类的访问权限不会改变
struct Pub_Derv: public Base{};
//例子1,类用户
Pub_Derv d;
d.pub_mem(); //正确
//例子2,派生类的派生类
struct Derived_from_Public: public Pub_Derv{
int use_base() { return prot_mem(); } //正确
};
二)protected派生说明符:基类的private,protected成员访问权限不变,但public成员将变为protected;
struct Prot_Derv: protected Base{};
//例子1,类用户
Prot_Derv d;
d.pub_mem(); //错误
//例子2,派生类的派生类
struct Derived_from_protected: protected Pub_Derv{
int use_base() {
pub_mem(); //正确
prot_mem(); //正确
}
};
三)private派生说明符:基类的所有成员访问权限都为private
struct Priv_Derv: private Base{}
//例子1,类用户
Priv_Derv d;
d.pub_mem(); //错误
//例子2,派生类的派生类
struct Derived_from_private: private Pub_Derv{
int use_base() {
pub_mem(); //错误
}
};