深入剖析C++成员权限问题。
来源:互联网 发布:逆波兰表达式c语言 编辑:程序博客网 时间:2024/05/20 02:55
一,C++中的类成员访问权限;
1,分类:
public: 具有这个访问控制级别的成员是完全公开的,任何环境下都可以通过对象访问这个成员
private: 具有这个访问控制级别的成员是完全保密的,即只能通过指向当前类(不包括派生类)的
this 指针才可以访问,其它环境均无法直接访问这个成员
protected: 具有这个访问控制级别的成员是半公开的:外界无法直接访问这个控制级别的成员,但是派生类的 this 指针可以获得访问能力。
2,C++中的默认权限是:
class是private
class中的成员的缺省权限也是private!
3,类的访问权限是针对于类而言的,如果是同一个类的话,名字空间相同。那么其中的相同的类的对象可以按照this指针操纵其中的成员。
eg:
class Test{
public:
Test();
Test(Test *t); //拷贝构造函数!
private:
int a;
};
Test::Test(Test *t)
{
a=t->a; //直接访问其中的私有,类似this指针!
}
二,C++中类的继承对成员访问权限的影响以及各种继承的权限关系!
1,C++中A类继承B类意味着A类中含有B类的所有成员,当然由于权限的缘故并不能那么顺利的访问他们就是了。
2,各种继承关系导致的访问权限的改变。
1)缺省情况的继承方式是private继承当然这并不是我们所应该的一个设计!所以应该要注意不要随意的用缺省的继承方式!
2) public 继承:
基类中的成员在派生类中的权限变化是: public--> public. protected-->protected. private-->不可访问!3)
3)protected继承:
权限变化是: public-->protected, protected-->protected。 private-->不能访问
4)private继承:
权限变化: public-->private, protected-->private,private-->不能访问。
PS:
a,其中权限发生变化的指的就是在派生类中可以通过this指针读取,但是他对于外界而言的权限发生相应的变化!
b,而其中的不能访问就是指在派生类当中即使是this指针也无法访问了!
c,归纳一点就是说,private的成员在派生类中不具备可访问性,而protectd跟public的成员则根据相应的继承方式而在派生类中的权限发生相应的变化。public不变,protected继承编程protectd,private全部编程private!
d,多层次的继承则按照这个规律递推...
例题:
class Base
{
public:
int m1;
protected:
int m2;
private:
int m3;
};
class PrivateClass:private Base
{
//m1,m2变成私有,m3不可访问
public:
void Test()
{
m1=1;
m2=2;
m3=3;//不可访问 }
};
class DrivedFromPri:public PrivateClass
{
//m1,m2不可访问,m3继续保持不可访问
public:
void Test()
{
m1=1;//不可访问
m2=2;//不可访问
m3=3;//不可访问
}
};
class ProtectedClass:protected Base
{
//m1,m2变成受保护数据,m3不可访问 public:
void Test()
{
m1=1;
m2=2;
m3=3;//不可访问
}
};
class DerivedFromPro:public ProtectedClass
{
//m1,m2继续为保护的,m3不可访问
public:
void Test()
{
m1=1;
m2=2;
m3=3;//不可访问
}
};
class PublicClass:public Base
{
//m1公有,m2受保护,m3不可访问
public:
void Test()
{
m1=1;
m2=2;
m3=3;//不可访问
}
};
class DerivedFromPub:public PublicClass
{
//m1保持公有,m2保持受保护,m3保持不可访问
public:
void Test()
{
m1=1;
m2=2;
m3=3;//不可访问 }
};
void main()
{
PrivateClass priobj;//m1,m2,m3都不可访问
priobj.m1=1;//不可访问
priobj.m2=2;//不可访问
priobj.m3=3;//不可访问
ProtectedClass proobj;//m1,m2受保护,m3不可访问
proobj.m1=1;//不可访问
proobj.m2=2;//不可访问
proobj.m3=3;//不可访问
PublicClass pubobj;//m1公有,m2受保护,m3不可访问
pubobj.m1=1;
pubobj.m2=2;//不可访问
pubobj.m3=3;//不可访问
}
1,分类:
public: 具有这个访问控制级别的成员是完全公开的,任何环境下都可以通过对象访问这个成员
private: 具有这个访问控制级别的成员是完全保密的,即只能通过指向当前类(不包括派生类)的
this 指针才可以访问,其它环境均无法直接访问这个成员
protected: 具有这个访问控制级别的成员是半公开的:外界无法直接访问这个控制级别的成员,但是派生类的 this 指针可以获得访问能力。
2,C++中的默认权限是:
class是private
class中的成员的缺省权限也是private!
3,类的访问权限是针对于类而言的,如果是同一个类的话,名字空间相同。那么其中的相同的类的对象可以按照this指针操纵其中的成员。
eg:
class Test{
public:
Test();
Test(Test *t); //拷贝构造函数!
private:
int a;
};
Test::Test(Test *t)
{
a=t->a; //直接访问其中的私有,类似this指针!
}
二,C++中类的继承对成员访问权限的影响以及各种继承的权限关系!
1,C++中A类继承B类意味着A类中含有B类的所有成员,当然由于权限的缘故并不能那么顺利的访问他们就是了。
2,各种继承关系导致的访问权限的改变。
1)缺省情况的继承方式是private继承当然这并不是我们所应该的一个设计!所以应该要注意不要随意的用缺省的继承方式!
2) public 继承:
基类中的成员在派生类中的权限变化是: public--> public. protected-->protected. private-->不可访问!3)
3)protected继承:
权限变化是: public-->protected, protected-->protected。 private-->不能访问
4)private继承:
权限变化: public-->private, protected-->private,private-->不能访问。
PS:
a,其中权限发生变化的指的就是在派生类中可以通过this指针读取,但是他对于外界而言的权限发生相应的变化!
b,而其中的不能访问就是指在派生类当中即使是this指针也无法访问了!
c,归纳一点就是说,private的成员在派生类中不具备可访问性,而protectd跟public的成员则根据相应的继承方式而在派生类中的权限发生相应的变化。public不变,protected继承编程protectd,private全部编程private!
d,多层次的继承则按照这个规律递推...
例题:
class Base
{
public:
int m1;
protected:
int m2;
private:
int m3;
};
class PrivateClass:private Base
{
//m1,m2变成私有,m3不可访问
public:
void Test()
{
m1=1;
m2=2;
m3=3;//不可访问 }
};
class DrivedFromPri:public PrivateClass
{
//m1,m2不可访问,m3继续保持不可访问
public:
void Test()
{
m1=1;//不可访问
m2=2;//不可访问
m3=3;//不可访问
}
};
class ProtectedClass:protected Base
{
//m1,m2变成受保护数据,m3不可访问 public:
void Test()
{
m1=1;
m2=2;
m3=3;//不可访问
}
};
class DerivedFromPro:public ProtectedClass
{
//m1,m2继续为保护的,m3不可访问
public:
void Test()
{
m1=1;
m2=2;
m3=3;//不可访问
}
};
class PublicClass:public Base
{
//m1公有,m2受保护,m3不可访问
public:
void Test()
{
m1=1;
m2=2;
m3=3;//不可访问
}
};
class DerivedFromPub:public PublicClass
{
//m1保持公有,m2保持受保护,m3保持不可访问
public:
void Test()
{
m1=1;
m2=2;
m3=3;//不可访问 }
};
void main()
{
PrivateClass priobj;//m1,m2,m3都不可访问
priobj.m1=1;//不可访问
priobj.m2=2;//不可访问
priobj.m3=3;//不可访问
ProtectedClass proobj;//m1,m2受保护,m3不可访问
proobj.m1=1;//不可访问
proobj.m2=2;//不可访问
proobj.m3=3;//不可访问
PublicClass pubobj;//m1公有,m2受保护,m3不可访问
pubobj.m1=1;
pubobj.m2=2;//不可访问
pubobj.m3=3;//不可访问
}
- 深入剖析C++成员权限问题。
- 深入剖析C++成员权限问题
- 关于数据库的权限设置深入剖析
- Objective-C类成员变量深度剖析
- Objective-C类成员变量深度剖析
- Objective-C类成员变量深度剖析
- Objective-C中循环引用的问题 深入剖析实用版
- c深入剖析跨函数调用指针(多级指针)问题
- C++:类的成员访问权限控制
- Objective-c的成员变量访问权限
- 【C++】:C++中的类成员访问权限
- C/C++面试题深入剖析
- 深入剖析C 重载函数的应用
- c/c++程序员应聘常见问题深入剖析
- SQL数据恢复问题深入剖析
- SQL数据恢复问题深入剖析
- [收藏]SQL数据恢复问题深入剖析
- SQL数据恢复问题深入剖析
- OFDM for Wireless Communications Systems
- 什么才是多线程安全的
- 在WinCE下,应用程序直接读/写/擦除flash设备的方法
- 一种全新的软件界面设计方法
- PHP Solutions: Dynamic Web Design Made Easy (Solutions)
- 深入剖析C++成员权限问题。
- 巩俐等明星更改国籍将被终止人大代表资格
- Linux中的线程同步
- 新手小记03之常量数组赋值
- 当代国人绝难做到的10件平常事 — 有点道理
- MySpy开发手记收藏
- 谷歌浏览器的源码分析(34)
- 写给设计人的10个jQuery特效
- WinCE5.0/6.0下,通过command line实现自动化编译