//类的继承 #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 --即父类的公有成员变成子类的保护成员,父类的保护成员成为子类的保护成员,父类的私有成员被子类继承,但不是子类的私有成员 总结:不同的继承方式可能改变继承成员的访问属性 */