当一个子类从父类继承时,父类的全部成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定。
c++访问权限和派生继承ide 在基类中,public表示成员是公有的:能够由程序中任何函数访问。因此公有成员通常是成员函数,它提供了外部程序与类的接口功能,用户经过公有成员访问该类对象中的数据。函数
第一:private, public, protected 访问标号的访问范围。
private:只能由1.该类中的函数、2.其友元函数访问。
不能被任何其余访问,该类的对象也不能访问。
protected:能够被1.该类中的函数、2.其友元函数访问 3.子类的函数。
但不能被该类的对象访问。
public:能够被1.该类中的函数、2.其友元函数访问 3.子类的函数、也能够由4.该类的对象访问。 class A { private: int a; public: int b; protected: int c; }; A ca; ca.a //error ca.b // ok ca.c //error class B :public A { public: int d; } B cb; cb.b; //ok cb.c //error。虽然c也是B的成员,但c在被继承的时候变成私有或者受保护的成员了。 注:友元函数包括3种:设为友元的普通的非成员函数;设为友元的其余类的成员函数;设为友元类中的全部成员函数。对象
派生类的生成过程:
class employeeblog {继承 }; class { }; 分析派生新类这个过程,其继承和派生机制的主要目的是实现代码的重用和扩充。实际是经历了三个步骤:吸取基类成员、改造基类成员、添加新的成员。 1.吸取基类成员 第一步是将基类的成员全盘接收:包含了它的全部基类中除构造和析构函数以外的全部成员。 这里派生类technician继承了基类employee的除构造和析构函数之外的全部成员: name; pay(); 通过派生过程,这些成员便存在于派生类之中。 2.改造基类函数 对基类成员的改造包括两个方面, 一个是基类成员的访问控制问题,主要依靠派生类声明时的继承方式来控制: 类的继承方式:public、protected和private三种访问属性。 第二个是对基类数据或函数成员的覆盖, 若是派生类声明了一个和某个基类成员同名的新成员(若是是成员函数,则参数表也要相同, 如pay(); 3.添加新的成员 咱们能够根据实际状况的须要,给派生类添加适当的数据和函数成员,来实现必要的新增功能。如technician派生类中的hourlyRate和workHours,在派生过程当中,因为基类的构造函数和析构函数是不能被继承下来的,所以咱们就须要在派生类从新加入新的构造函数和析构函数来实现一些特别的初始化和清理工做,例如派生类technician的构造函数technician(); 第二:类的继承后方法属性变化。
特别的private,它们与派生类中新增长的private成员不一样,派生类函数或是创建派生类对象的模块都没法访问到它们。)(因此只能经过在派生类中调用基类的函数去访问private属性,也能够把基类的函数用public继承下来来访问)
private继承,父类的全部方法在子类中变为private; protected继承,父类的protected和public方法在子类中变为protected,private方法不变; public继承,父类中的方法属性不发生改变; 原来是怎样就怎样
public和protected在任何方式继承的状况下,也能被子类函数调用。
以下所示:
public继承 protected继承
protected
特别的private:不能被派生类函数和派生类对象直接调用,(用派生类对象访问时)
只能从新定义:调用基类
private继承
private:不能被派生类对象直接调用,1.可间接被派生类函数从新定义来调用。2.基类函数调用(用派生类对象访问时)只能从新定义:调用基类
上面为一次继承的状况,如有些是没区别的,当时若是再继承的话就有区别了
继承下来的访问属性分为四种:
1.区分继承与访问,
特别的private为不能继承下来的,但能够访问
2.(
private)成员:包括从基类继承下来的非私有成员(私有继承时),以及派生类中新增长的私有成员,在派生类内部函数均可以访问到,但派生类对象不能访问。
3.(
protected)多是新增也多是从基类继承过来的,派生类内部成员函数能够访问,当派生类对象没法访问。
4.(public)成员:派生类成员函数和对象都能访问到
protected继承和private继承能下降访问权限。
基类的public和protected成员的访问属性在派生类中不变,而基类的private成员仍保持私有属性。
可得:派生类的其余成员函数和对象能够直接访问基类的公有成员和保护成员。
公有public继承
class vehicle
{
};
class car:public vehicle
{
//这里不是调用基类构造函数,而是初始化赋值列表。
{
int get_passengers(){return passenger_load;}
};
void main()
{
car bluebird(4,1000);
cout<<"The message of bluebird(wheels,weight,passengers):"<<endl;
cout<<bluebird.get_wheels()<<","
}
car public继承verhicle后,
private:wheels;
protected:weight;
public:
保护protected继承
基类的public和protected成员都变为保护成员,而基类的private成员不可访问。
即基类中的保护成员只能被基类的成员函数或派生类的成员函数访问。
举例:
car protected继承verhicle后,
private:wheels;
protected:weight;
public
因此要在派生类中使用对象访问,必须作一下修改:
class car:protected vehicle
{
//这里不是调用基类构造函数,而是初始化赋值列表。
{
int get_passengers(){return passenger_load;}
};
这里为了保证基类的部分外部接口特征可以在派生类中也存在,就必须在派生类中从新定义同名的成员函数 get_wheels()和get_weight(),根据同名覆盖的原则,在主函数中天然调用的是派生类的函数。
若是使用私有继承: 在该例子和protected同样。 |