关于继承成员的访问权限
- 派生类继承基类有三种方式:公有继承,私有继承,保护继承。
- 以下例子为之前的简单例子,分析以下程序可知:
- 当派生类Student公有继承基类Person时:
①. 派生类Student继承了基类Person中除构造函数和析构函数以外的所有成员。但是派生类可以直接调用它们吗?答案是并不都可以直接调用,需要看基类中成员的访问权限。
②. 在基类Person中,数据成员是私有的,在派生类中并不可以访问到,只能通过有关的成员函数访问;基类中的保护成员函数p,在派生类中可以直接访问到,但出了派生类,即在类外声明的对象是无法直接访问它的,因为它是受到保护的;而基类中的公有成员函数setPerson和print也是可以在派生类中直接访问的,出了派生类后在外声明的对象也可以直接访问。
③. 即当继承方式为public时,基类中的private到了派生类中还是private,protected还是protected,public还是public。 - 当派生类Student私有继承基类Person时:
①. 基类中的公有成员和保护成员被继承下来作为派生类的私有成员,派生类的成员可以直接访问它们;而基类的私有成员被派生类继承下来后,不能直接访问。
②. 当继承方式为private时,基类中的private到了派生类还是private,protected变成private,public变成private。
③. 所以由此看出当为私有继承的时候,派生类外部声明的对象无法访问基类中所有的成员,基类中的接口全部在派生类中变成私有,也不会在以后的继承中起作用,需要重写一些公有接口来替换基类中已失效的公有接口。因此在实际派生中,一般不采用私有派生方式。 - 当派生类Student保护继承基类Person时:
①. 基类中的公有成员和保护成员被继承下来作为派生类的保护成员,派生类的成员可以直接访问;而基类中的私有成员被派生类继承下来后,不能直接访问。
②. 当继承方式为protected时,基类中的private到了派生类还是private,protected还是protected,public变成protected。
#include <iostream>
using namespace std;
class Person{
private:
string name;
int age;
char sex;
protected:
void p()
{
cout<<"基类保护成员"<<endl;
}
public:
void setPerson(string name1,int age1,char sex1)
{
name=name1;
age=age1;
sex=sex1;
}
void print()
{
cout<<name<<'\t'<<age<<'\t'<<sex<<endl;
}
};
class Student:public Person{
private:
string sno;
float score;
public:
void setStudent(string name1,int age1,char sex1,string sno1,float score1)
{
setPerson(name1,age1,sex1);
sno=sno1;
score=score1;
}
void print()
{
Person::print();
cout<<sno<<'\t'<<score<<endl;
}
};
int main()
{
return 0;
}