一个案例带你弄懂类的继承方式对子类对外访问属性影响以及static遇到继承
2015-01-02 10:46
246 查看
C++中的继承方式(public,private,protected)会影响子类的对外访问属性
1.判断某一句话,能否被访问
2.看子类如何从父类继承(public,private,protected)
3.看父类中的访问级别(public,private,protected)
以下是综合练习
static:
基类定义的静态成员,将被所有派生类共享
根据静态成员自身的访问特性和派生类的继承方式,在类层次
体系中具有不同的性质
派生类中访问静态成员,以下形式显式说明:
类名::成员
或通过对象访问
对象名.成员
1.判断某一句话,能否被访问
2.看子类如何从父类继承(public,private,protected)
3.看父类中的访问级别(public,private,protected)
以下是综合练习
#include <cstdlib> #include <iostream> using namespace std; class A { private://私有 int a; protected://保护 int b; public: //继承 int c; A() { a = 0; b = 0; c = 0; } void set(int a, int b, int c) { this->a = a; this->b = b; this->c = c; } }; class B : public A//公有继承 { public: void print() { //cout << "a = " << a;//写在子类的内部,a在父类是私有,在子类无法访问 cout << "b = " << b;//OK cout << "c = " << endl;//OK } }; class C : protected A//保护继承 { public: void print() { //写在子类内部 // cout << "a = " << a;父类私有无法访问 cout << "b = " << b;//ok cout << "c = " << endl;//ok(保护的子类的内部可以使用) } }; class D : private A//私有继承 { public: void print() { //cout << "a = " << a; cout << "b = " << b << endl;//OK(b在父类是保护,在子类是私有) cout << "c = " << c << endl;//OK(在父类是公有,在子类为私有) } }; int main() { A aa; B bb; C cc; D dd; aa.c = 100;//ok bb.c = 100;//(子类的外部,父类为public)//ok //cc.c = 100;//error(在子类外部,在子类为protected,无法访问了) //dd.c = 100;//error无法访问,(在子类外部,在子类为private) aa.set(1, 2, 3);//父类public bb.set(10, 20, 30);//父类public,子类public继承 //cc.set(40, 50, 60);//保护继承,无法在外部访问 //dd.set(70, 80, 90);//私有继承,在外部无法访问 bb.print();//下面几个都可以,子类定义的访问为public cc.print();//OK dd.print();//OK system("pause"); return 0; }
static:
基类定义的静态成员,将被所有派生类共享
根据静态成员自身的访问特性和派生类的继承方式,在类层次
体系中具有不同的性质
派生类中访问静态成员,以下形式显式说明:
类名::成员
或通过对象访问
对象名.成员
#include<iostream> #include<stdlib.h> class A { public: A() { std::cout << a << std::endl; } public: /*A() { a = 0; }*/ static int a; int b; void printfB() { std::cout << "我是父类的B=" << b << std::endl; } void print() { std::cout << "我是父类" << std::endl; } protected: private: }; //这句话的意思是给static初始化, //告诉c++编译器为整个类4个字节分配内存空间 int A::a = 0;//不光是给static初始化,告诉c++编译器分配内存 class B :private A { public: int b; int c; void print() { std::cout << "我是子类" << std::endl; //std::cout << a << std::endl;//a不可以用 } }; void main() { A a1; B bl; bl.print(); system("pause"); }
相关文章推荐
- 类的继承方式对子类对外访问属性影响,赋值兼容性原则
- 三种继承方式和访问控制方式对子类成员的影响
- C++成员访问控制,以及C++继承方式对成员访问控制的影响
- java中常遇到的小问题——static关键字、继承访问控制方式、构造器的继承与super关键字
- C++中继承方式对访控属性的影响
- c++笔记06---继承,公有继承,继承方式对访控属性的影响,私有继承和保护继承
- C++学习之成员函数的访问属性与继承属性对虚表构建的影响--个人理解
- 遇到问题----win7安装apache服务出现 <OS 10013> 以一种访问权限不允许的方式做了一个访问套接字的尝试
- C程序访问hadoop运行时遇到的各种问题以及解决方案(环境变量不被sudo继承)
- Yii2-用属性的方式来访问类的一个方法
- DTO的理解以及spring遇到的一个问题注解方式对象为空
- 【一天一篇CPP】继承和派生:基础知识和继承方式与访问属性
- c++ 中继承方式权限转变 以及 恢复访问权限
- JavaScript中通过数组索引方式访问和属性名方式访问对象属性的一个小小误区
- 类成员的3种访问属性 类的3种继承方式(继承性也叫派生性)
- C++的类型转换:static_cast、dynamic_cast、reinterpret_cast和const_cast(dynamic_cast还支持交叉转换,const_cast将一个类的const、volatile以及__unaligned属性去掉)
- java中instanceof关键字的使用,以及子类是否继承了父类的所有属性
- Hibernate继承映射--每个子类一个数据表的实现案例
- SE24新建类步骤以及如何继承一个系统类的属性
- 关于struts2的namespace属性,在地址栏里直接访问action的方法 ,以及用一个jsp的表单跳到上面去