C++ 访问权限问题主要包括两种:一种是外界对类成员的普通访问,主要通过类内的public、protected、private权限修饰符;另一种是继承关系中子类对父类成员的访问。
基本原则:外界只能访问类中public成员,子类可访问父类的public和protected成员;不同继承方式只影响外界(包括子类的子类)通过子类对父类成员的访问权限。
- 外界对类成员的普通访问
1. 当类成员在类中为public权限时,才可在类外访问,其余不可访问。
2. 若存在继承关系,从父类继承来的成员若在该类中仍具有public权限,也可在类外访问,其余不可访问。
- 继承关系中子类对父类成员的访问
1. 无论通过什么方式(public、protected、private)继承,在子类内部均可访问父类中的public、protected成员,private成员不可访问。
注意:
继承方式只影响外界(包括子类的子类)通过子类对父类成员的访问权限。
public继承,父类成员的访问权限全部保留至子类;
protected继承,父类public成员的访问权限在子类中降至protected;
private继承,父类public、protected成员的访问权限在子类中均降至private。
2. 父类的析构函数若声明为protected (无论有无virutal),外界均不可调用delete 父类指针;因为是protected权限,子类析构后会自动调用父类析构函数。
这种情况下,最好不要在父类成员中有动态内存分配。
3. 通过protected/private继承的子类,不能通过static_cast/dynamic_cast向父类转换;只能通过reinterpret_cast引用或指针的方式强制转换,按照父类内存结构重新解释,可改变成员的访问权限。