C++中public、protected、private三种权限继承详解

文章目录

  • C++中public、protected、private三种权限继承详解
    • public
    • private
    • protected
  • 总结

C++中public、protected、private三种权限继承详解

先看一下C++在继承中的访问权限

权限/作用域 全局 派生类 当前类
private
protected
public

public

public继承是一种最简单的继承,基类的成员在派生类中保持原有的权限不会被更改。

public继承示例:

#include 

using namespace std;

/*
    公有继承Test.
*/

class Father
{
//基类的私有变量
private:
    void test()
    {
        cout << "Father's Private." << endl;
    }
//基类的保护变量
protected:
    void test1()
    {
        cout << "Father's Protected" << endl;
    }
//基类的公共变量
public:
    void test2()
    {
        cout << "Father's Public" << endl;
    }
};

//基类的派生类: 共有继承
class Son:public Father
{
public:
    //派生类的成员
    void son_func()
    {
        test1();    //基类的protect.
        test2();    //基类的public.
    }
};

//基类派生类的派生类
class Grandson:public Son
{
public:
    void grandson_func()
    {    
        test1();
        test2();
    }
};

int main()
{
    //测试:基类的派生类Son
    Son s;
    //s.test1();    //子类的对象也是只能够访问到基类的public成员
    s.test2();      
    s.son_func();   //派生类的成员可以访问基类protected和public成员
    
    cout << "-------- This is a dividing line. --------" << endl;
    
    //测试:基类派生类的子类Grandson
    Grandson g;
    //g.test1();    //跟上面是一个原因
    g.test2();
    g.grandson_func();

    return 0;
}

运行结果如下:
C++中public、protected、private三种权限继承详解_第1张图片


private

private继承在派生类中将基类的成员权限转换为private,派生类的成员可以访问基类的privateprotected成员,但是派生类的对象不可以访问基类的所有成员

private继承示例:

#include 

using namespace std;

/*
    私有继承Test.

    总结: 私有继承,基类的成员变为private被隐藏,派生类的对象不可访问基类的任何成员,
        但是派生类的成员可以访问基类的public和protect成员,但是如果进一步继承的话,
        派生类将不能够访问基类的任何成员.

*/

class Father
{
//基类的私有变量
private:
    void test()
    {
        cout << "Father's Private." << endl;
    }
//基类的保护变量
protected:
    void test1()
    {
        cout << "Father's Protected" << endl;
    }
//基类的公共变量
public:
    void test2()
    {
        cout << "Father's Public" << endl;
    }
};

//基类的派生类: 私有继承
class Son:private Father
{
public:
    //派生类的成员
    void son_func()
    {
        //私有继承,派生类的成员可以访问基类的public和protect成员
        test1();    //基类的protect.
        test2();    //基类的public.
    }
};

//基类派生类的派生类
class GrandSon:private Son
{
    /*
        私有继承的再一步继承,派生类将不能访问基类的任何成员
        派生类的成员也不可以访问
    */
    // void grandson_func()
    // {    
    //     test1();
    //     test2();
    // }
};

int main()
{
    //测试:基类的派生类Son
    Son s;
    //s.test();  Error.私有继承派生类的对象不能够访问基类的任何成员
    s.son_func();   //派生类的成员可以访问基类protected和public成员
    
    return 0;
}

运行结果如下:
private_inheritance_result


protected

·protect将基类的成员权限转换为protected,派生类的成员可以访问基类的privateprotected成员,但是派生类的对象不可以访问基类的所有成员,基本跟private一致

#include 

using namespace std;

/*
    保护继承Test.

    总结: 保护继承,基类的成员变为protected,private成员被隐藏,派生类的对象不可访问
        基类的任何成员,但是派生类的成员可以访问基类的public和protect成员,派生类还
        可以在进一步继承
*/

class Father
{
//基类的私有变量
private:
    void test()
    {
        cout << "Father's Private." << endl;
    }
//基类的保护变量
protected:
    void test1()
    {
        cout << "Father's Protected" << endl;
    }
//基类的公共变量
public:
    void test2()
    {
        cout << "Father's Public" << endl;
    }
};

//基类的派生类: 保护继承
//经过当前次继承之后,再往下继承得时候基类的成员属性都是按照protect属性往下继承的
class Son:protected Father
{
public:
    //派生类的成员
    void son_func()
    {
        //私有继承,派生类的成员可以访问基类的public和protect成员
        test1();    //基类的protect.
        test2();    //基类的public.
    }
};

//基类派生类的派生类
class GrandSon:protected Son
{
    /*
        保护继承的再一步继承,派生类的派生类的成员同样可以访问基类
        的public和protect成员
    */
public:
    void grandson_func()
    {    
        test1();
        test2();
    }
};

int main()
{
    //测试:基类的派生类Son
    Son s;
    //s.test();  Error.保护继承派生类的对象不能够访问基类的任何成员
    s.son_func();   //派生类的成员可以访问基类protected和public成员
    
    cout << "-------- This is a dividing line. --------" << endl;
	
	//测试:基类派生类的子类Grandson
    GrandSon g;
    ///g.test();
    //g.test2(); Error.保护继承派生类的在继承类的对象不能够访问基类的任何成员
    g.grandson_func();
    
    return 0;
}

运行结果如下:
protected_inheritance_result

总结

  • public继承不会改变基类的成员的访问权限

  • private继承使得基类所有成员在派生类的访问权限变为private,派生类的成员可以访问基类的publicprotected成员,但是派生类的对象不可以访问基类的任何成员,并且如果再继承的话,派生类的子类的成员也不能访问基类的成员

  • protect继承使得基类成员在派生类的访问权限变为protected,派生类的成员可以访问基类的publicprotected成员,但是派生类的对象不可以访问基类的任何成员,它可以再向下继承,相当于把基类的成员属性一直按照protected向下继承

  • 注意:基类private属性的成员永远不能被访问

简单来说protect继承和private继承除了在再继承方面有区别,其他的可以认为是一样。

你可能感兴趣的:(C++,c++,面向对象编程,类)