如何建立自己的网站商城,网站备案链接直接查看,合肥营销网站建设公司,舟山网站制作C中public#xff0c;protected#xff0c;private以及它们在继承中表示的一些访问范围#xff0c;很容易搞糊涂。今天本文就来十分分析一下C中public、protected及private用法。
这里我们首先要明白下面几点。
1.类的一个特征就是封装#xff0c;public和private作用就是… C中publicprotectedprivate以及它们在继承中表示的一些访问范围很容易搞糊涂。今天本文就来十分分析一下C中public、protected及private用法。
这里我们首先要明白下面几点。
1.类的一个特征就是封装public和private作用就是实现这一目的。所以
用户代码类外可以访问public成员而不能访问private成员private成员只能由类成员类内和友元访问。
2.类的另一个特征就是继承protected的作用就是实现这一目的。所以
protected成员可以被派生类对象访问不能被用户代码类外访问。
现来看看如下示例
#includeiostream
#includeassert.h
using namespace std;
class A{
public:int a;A(){a1 1;a2 2;a3 3;a 4;}void fun(){cout a endl; //正确cout a1 endl; //正确cout a2 endl; //正确类内访问cout a3 endl; //正确类内访问}
public:int a1;
protected:int a2;
private:int a3;
};
int main(){A itema;itema.a 10; //正确itema.a1 20; //正确itema.a2 30; //错误类外不能访问protected成员itema.a3 40; //错误类外不能访问private成员system(pause);return 0;
}
继承中的特点
先记住不管是否继承上面的规则永远适用
有public, protected, private三种继承方式它们相应地改变了基类成员的访问属性。
1.public继承基类public成员protected成员private成员的访问属性在派生类中分别变成public, protected, private
2.protected继承基类public成员protected成员private成员的访问属性在派生类中分别变成protected, protected, private
3.private继承基类public成员protected成员private成员的访问属性在派生类中分别变成private, private, private
但无论哪种继承方式上面两点都没有改变
1.private成员只能被本类成员类内和友元访问不能被派生类访问
2.protected成员可以被派生类访问。
再来看看以下代码
public继承
代码如下
#includeiostream
#includeassert.h
using namespace std;class A{
public:int a;A(){a1 1;a2 2;a3 3;a 4;}void fun(){cout a endl; //正确cout a1 endl; //正确cout a2 endl; //正确cout a3 endl; //正确}
public:int a1;
protected:int a2;
private:int a3;
};
class B : public A{
public:int a;B(int i){A();a i;}void fun(){cout a endl; //正确public成员cout a1 endl; //正确基类的public成员在派生类中仍是public成员。cout a2 endl; //正确基类的protected成员在派生类中仍是protected可以被派生类访问。cout a3 endl; //错误基类的private成员不能被派生类访问。}
};
int main(){B b(10);cout b.a endl;cout b.a1 endl; //正确cout b.a2 endl; //错误类外不能访问protected成员cout b.a3 endl; //错误类外不能访问private成员system(pause);return 0;
}
protected继承
代码如下
#includeiostream
#includeassert.h
using namespace std;
class A{
public:int a;A(){a1 1;a2 2;a3 3;a 4;}void fun(){cout a endl; //正确cout a1 endl; //正确cout a2 endl; //正确cout a3 endl; //正确}
public:int a1;
protected:int a2;
private:int a3;
};
class B : protected A{
public:int a;B(int i){A();a i;}void fun(){cout a endl; //正确public成员。cout a1 endl; //正确基类的public成员在派生类中变成了protected可以被派生类访问。cout a2 endl; //正确基类的protected成员在派生类中还是protected可以被派生类访问。cout a3 endl; //错误基类的private成员不能被派生类访问。}
};
int main(){B b(10);cout b.a endl; //正确。public成员cout b.a1 endl; //错误protected成员不能在类外访问。cout b.a2 endl; //错误protected成员不能在类外访问。cout b.a3 endl; //错误private成员不能在类外访问。system(pause);return 0;
} private继承
代码如下
#includeiostream
#includeassert.h
using namespace std;
class A{
public:int a;A(){a1 1;a2 2;a3 3;a 4;}void fun(){cout a endl; //正确cout a1 endl; //正确cout a2 endl; //正确cout a3 endl; //正确}
public:int a1;
protected:int a2;
private:int a3;
};
class B : private A{
public:int a;B(int i){A();a i;}void fun(){cout a endl; //正确public成员。cout a1 endl; //正确基类public成员,在派生类中变成了private,可以被派生类访问。cout a2 endl; //正确基类的protected成员在派生类中变成了private,可以被派生类访问。cout a3 endl; //错误基类的private成员不能被派生类访问。}
};
int main(){B b(10);cout b.a endl; //正确。public成员cout b.a1 endl; //错误private成员不能在类外访问。cout b.a2 endl; //错误, private成员不能在类外访问。cout b.a3 endl; //错误private成员不能在类外访问。system(pause);return 0;
}
通过以上的代码都备有较为详尽的注释读者应该能够理解。仔细看代码中派生类B中定义了和基类同名的成员a此时基类的a仍然存在可以验证。
int main(){cout sizeof(A) endl;cout sizeof(B) endl;system(pause);return 0;
}
输出
16
20
所以派生类包含了基类所有成员以及新增的成员同名的成员被隐藏起来调用的时候只会调用派生类中的成员。
如果要调用基类的同名成员可以用以下方法
int main(){B b(10);cout b.a endl;cout b.A::a endl;system(pause);return 0;
}
输出
10
4
记得这里是在类外访问而a在基类中是public所以继承方式应该为public使得a在派生类中仍然为public在类外可以访问。