浅谈C++类中的三大继承方式:公有继承、私有继承、保护继承

派生类继承了基类的全部数据成员和除了构造函数,析构函数之外的全部函数成员,但是,这些成员的访问属性在派生过程中是可以调整的。从基类继承的成员,其访问的英文属性由继承方式控制的。

所说这里的访问来自两个方面:一是派生类中的新增成员访问从基类继承的成员,的英文二在派生类的外部(非类族内的成员),通过派生类的对象访问从基类继承的成员。

类的继承方式有:公有继承,私有继承,保护继承

类当继承的方式为公有继承时:

基类的公共成员和受保护成员在派生类中访问属性(大众还是大众,受保护的还是保护的)还是不变,但是在类族之外的派生类的对象只能访问基类的公共成员,受保护和私有成员通过对象都不可以访问。在派生类中,只有基类的私有成员在派生类中不可直接访问。

类当继承的方式为私有继承时:

基类的公用成员和保护成员都以私人身份出现在派生类中,所以在类族之外的派生类的对象不能访问基类的公共和保护的成员,当然包括基类的私有成员。由于继承基类的函数可以说是派生类拥有对基类函数的调用权,所以在派生类中的其他成员可以直接访问基类的公共和保护成员,对于函数,一般采用在函数中调用基类的公共或保护函数的方式访问。

类当继承的方式为保护继承时:

基类的公用成员和保护成员都以保护身份出现在派生类中。在类族之外的派生类的对象和在派生类中的其他成员对于公众,保护,私人的访问权限与私有继承相同。

具体区别可看下面程序:

#include<iostream>  
using namespace std; 

class A 
{ 
private: 
    int privatetedateA;
protected:  
    int protecteddateA; 
public:
    int publicdateA;
};
  
class B :public A      
{  
public:  
    void funct()  
    {  
        int b;  
        b=privatedateA;   //error:基类中私有成员在派生类中是不可见的  
        b=protecteddateA; //true:基类的保护成员在派生类中为保护成员  
        b=publicdateA;    //true:基类的公共成员在派生类中为公共成员  
    }  
};  
/  
class C :private A  
{  
public:  
    void funct()  
    {  
        int c;  
        c=privatedateA;    //error:基类中私有成员在派生类中是不可见的  
        c=protecteddateA;  //true:基类的保护成员在派生类中为私有成员  
        c=publicdateA;     //true:基类的公共成员在派生类中为私有成员  
    }  
};  

class D :protected A  
{  
public:  
    void funct()  
    {  
        int d;  
        d=privatedateA;   //error:基类中私有成员在派生类中是不可见的  
        d=protecteddateA; //true:基类的保护成员在派生类中为保护成员  
        d=publicdateA;    //true:基类的公共成员在派生类中为保护成员  
    }  
};  

int main()  
{  
    int a;   
   
    B objB;  
    a=objB.privatedateA;   //error:基类中私有s成员在派生类中是不可见的,对对象不可见  
    a=objB.protecteddateA; //error:基类的保护成员在派生类中为保护成员,对对象不可见  
    a=objB.publicdateA;    //true:基类的公有成员在派生类中为公共成员,对对象可见  
   
    C objC;  
    a=objC.privatedateA;   //error:基类中私有成员在派生类中是不可见的,对对象不可见  
    a=objC.protecteddateA; //error:基类的保护成员在派生类中为私有成员,对对象不可见  
    a=objC.publicdateA;    //error:基类的公有成员在派生类中为私有成员,对对象不可见  
   
    D objD;  
    a=objD.privatedateA;   //error:基类中私有成员在派生类中是不可见的,对对象不可见  
    a=objD.protecteddateA; //error:基类的保护成员在派生类中为保护成员,对对象不可见  
    a=objD.publicdateA;    //error:基类的公有成员在派生类中为保护成员,对对象不可见  
   
    return 0;  
}  

 
 

所以私有继承和保护继承的区别是什么呢?

具体体现在派生类继续派生的情况下,假设从左到右继承的三个类:

1.

以上面的方式继承,则Square类不能访问间接从Point类继承来的成员。

以下面的方式继承,则Point类中所有的public和protected成员,被Square类间接继承后,有可能是protected和private的(视从Rectangle类到Square类继承方式不同而不同),因此Square类是有可能访问间接从Point类中继承来的成员。


从继承的访问规则,可以看到类中保护成员的特征

如果点类中含有保护成员,对于建立点类的对象的模块来讲,保护和该类的私有一样是不可访问的。

如果点类派生出子类长方形,则对于矩形类来讲,保护和公众成员具有像同的访问特性。

换言之,就是点类的保护成员有可能被它的派生类访问,但是绝不可能被其它外部使用者(比如程序中的普通函数,与点类平行的其他类等)访问。

这样,如果合理利用保护成员,就可以在类的复杂层次关系中共享与成员隐蔽之间找到一个平衡点,既能实现成员隐蔽,又能方便继承,实现代码的高效重用和扩充。





猜你喜欢

转载自blog.csdn.net/dyd850804/article/details/80514591