下列程序编译时会出现错误,请根据行号选择错误位置:1,2,4,5,6
#include <iostream>
using namespace std;
class A{
int a1;
protected:
int a2;
public:
int a3;
};
class B: public A{
int b1;
protected:
int b2;
public:
int b3;
};
class C:private B{
int c1;
protected:
int c2;
public:
int c3;
};
int main(){
B obb;
C obc;
cout<<obb.a1;//1
cout<<obb.a2;//2
cout<<obb.a3;//3
cout<<obc.b1;//4
cout<<obc.b2;//5
cout<<obc.b3;//6
cout<<obc.c3;//7
return 0;
}
根据上题子类对父类的不同继承可以得到下图:
对该题进行分析如下:
总结:
派生类中成员的访问属性:
(1)基类中访问属性为公有public:派生类中可以访问;派生类外部(指建立派生类对象,在派生类的类外部)可以访问;下层公有派生类中可以访问。
(2)基类中访问属性为保护protected:派生类中可以访问;派生类外部(指建立派生类对象)不可访问;下层公有派生类中可以访问。
(3)基类中访问属性为私有private:派生类中可以访问;派生类外部(指建立派生类对象)不可访问;下层公有派生类中不可访问。
(4)私有继承和保护继承的区别(即在私有派生类和保护派生类中的区别):在直接派生类中,两者均为在类外不可访问,而在派生类中可以通过成员函数访问基类的私有成员和保护成员;若继续派生,私有成员在派生类中也无法访问。
(5)对于protected保护成员:其在基类中可以被访问;在派生类中可以被访问;但类的实例(创建类的对象)无法访问。
对上图进行总结+扩充:
(1)一个类的访问控制为:
public:公有成员,可以被类内及类外访问。
private:私有成员,只能被内部访问。
protected:保护成员,只能被内部或继承类内部访问。
(2)继承类的访问修饰符为:
无论何种继承,在继承类中父类的私有成员在子类中依然存在,但均不可访问。
public:公有继承,父类成员在子类中保持原有的访问属性。
private:私有继承,父类成员在子类中成为私有成员。
protected:保护继承,public和protected均变为protected,private也变为private。