C++ 类的继承一(访问控制)

Posted 庖丁解牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 类的继承一(访问控制)相关的知识,希望对你有一定的参考价值。

//类的继承
#include<iostream>
using namespace std;

/*
面向对象中的继承类之间的父子关系
1.子类拥有父类所有的成员属性和成员函数(包括私有成员变量)
2.子类就是一种特殊的父类
3.子类对象可以当作父类对象使用
4.子类可以拥有父类没有的方法和属性

c++中的类成员访问级别(public,protected,private)

类成员访问级别设置原则
1.需要被外界访问的成员直接设置为public
2.只能在当前类中访问的成员设置为private
3.只能在当前类和子类中访问的成员设置为protected,protected的成员访问权限介于public和private之间



判断类成员变量访问权限三步骤
1.看调用语句写在子类的内部还是外部
2.看子类如何从父类继承(public,protected,private)
3.看父类中的访问级别(public,protected,private)


*/

class A{
public:
    int a;
protected:
    int b;
private:
    int c;
};

class B:public A
{
public:
    void Test1(){
        a = 10;//父类的公有成员可以在子类内部访问
        b = 20;//父类的保护成员可以在子类内部访问
        //c = 20;  报错: 父类的私有成员在子类内部无法访问
    }
};
class Bt :public B
{
public:
    void Test12(){
        a = 10;//可以访问B类中的a属性--说明a属性的访问级别至少是public或者protected
        b = 20;//可以访问B类中的b属性--说明a属性的访问级别至少是public或者protected
        //c = 20;  报错:  父类的私有成员在子类内部无法访问
    }
};

void Protect1(){
    B b1;
    b1.a = 11;//父类的公有成员可以在子类外部访问
    //证明:public继承父类,父类的公有成员会变成子类的公有成员
    //b1.b = 21;  报错  说明:public继承父类,父类的保护成员会变成子类的保护成员
}

class C :protected A{
    void Test1(){
        a = 10;//父类的公有成员可以在子类内部访问
        b = 20;//父类的保护成员可以在子类内部访问
        //c = 20;  报错: 父类的私有成员在子类内部无法访问
    }
};

class Ct :public C{
    void Test12(){
        a = 10;//可以访问C类中的a属性--说明a属性的访问级别至少是public或者protected
        b = 20;//可以访问C类中的b属性--说明a属性的访问级别至少是public或者protected
        //c = 20;  报错:  父类的私有成员在子类内部无法访问
    }
};

void Protect2(){
    C c1;
    //c1.a = 10;  报错 :error C2247 : “A::a”不可访问,因为“C”使用“protected”从“A”继承
    //说明 protected继承父类,父类的公有成员会变为子类的保护成员
    //c1.b = 21;  报错  error C2248 : “A::b” : 无法访问 protected 成员(在“A”类中声明)
    //说明 protected继承父类,父类的保护成员会变为子类的保护成员
}

class D :private A{
    void Test1(){
        a = 10;//父类的公有成员可以在子类内部访问
        b = 20;//父类的保护成员可以在子类内部访问
        //c = 20;  报错: 父类的私有成员在子类内部无法访问
    }
};

class Dt :public D{
    void Test12(){
        //a = 10;   报错  error C2247 : “A::a”不可访问,因为“D”使用“private”从“A”继承
        //D中的成员变量无法被其子类访问,说明a成员属性是D的私有成员属性
        //b = 20;   报错  error C2248 : “A::b” : 无法访问 无法访问的 成员(在“A”类中声明)
        //D中的成员变量无法被其子类访问,说明b成员属性是b的私有成员属性
        //说明:private继承父类,父类中的公有成员变量会变成子类的私有成员变量,父类的保护成员变量会变成子类的私有成员变量
    }
};

void main(){
    system("pause");
}

/*
c++的继承方式(public,private,protected)会影响子类对外的访问属性
public继承:父类成员在子类中保持原有的访问级别
--即父类的公有成员变成子类的公有成员,父类的保护成员成为子类的保护成员,父类的私有成员被子类继承,但是不是子类的私有成员
private继承:父类成员在子类中变为private成员
--即父类的公有成员变成子类的私有成员,父类的保护成员成为子类的私有成员,父类的私有成员被子类继承,但是不是子类的私有成员
protected继承:父类中public成员变成protected
--即父类的公有成员变成子类的保护成员,父类的保护成员成为子类的保护成员,父类的私有成员被子类继承,但是不是子类的私有成员

总结:不同的继承方式可能改变继承成员的访问属性
*/

 

以上是关于C++ 类的继承一(访问控制)的主要内容,如果未能解决你的问题,请参考以下文章

回顾C++:访问权限控制之 公有保护私有继承用法详解与总结

(C++)4段代码弄清基本的访问控制

C++ 继承&多态

C++继承的应用

C++类的继承与派生

对象的继承访问控制