[关闭]
@skyway 2015-10-18T09:38:09.000000Z 字数 2312 阅读 898

私有、公有与保护(private/public/protected)

C++


title: 私有、公有与保护(private/public/protected)
date: 2015-08-27 14:29:35
catagories: 编程
tags: [C++]


公有成员

可以被对象直接访问,可以被派生类直接访问。

私有成员

只能由类的成员间接访问,不能被派生类访问。

保护成员

只能由类的成员间接访问,可以被派生类直接访问。

公有继承(public)

公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。

(1) 基类成员对其对象的可见性:
公有成员可见,其他不可见。这里保护成员同于私有成员。

(2) 基类成员对派生类的可见性:
公有成员和保护成员可见,而私有成员不可见。这里保护成员同于公有成员。

(3) 基类成员对派生类对象的可见性:
公有成员可见,其他成员不可见。

在公有继承时,派生类的对象可以访问基类中的公有成员;派生类的成员函数可以访问基类中的公有成员和保护成员。

私有继承(private)

私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。

(1) 基类成员对其对象的可见性:
公有成员可见,其他成员不可见。

(2) 基类成员对派生类的可见性:
公有成员和保护成员是可见的,而私有成员是不可见的。

(3) 基类成员对派生类对象的可见性:
所有成员都是不可见的。

保护继承(protected)

保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。

可见性与private继承情况相同。

  1. #include<iostream>
  2. using namespace std;
  3. //////////////////////////////////////////////////////////////////////////
  4. class A //父类
  5. {
  6. private:
  7. int privatedateA;
  8. protected:
  9. int protecteddateA;
  10. public:
  11. int publicdateA;
  12. };
  13. //////////////////////////////////////////////////////////////////////////
  14. class B :public A //基类A的派生类B(共有继承)
  15. {
  16. public:
  17. void funct()
  18. {
  19. int b;
  20. b=privatedateA; //error:基类中私有成员在派生类中是不可见的
  21. b=protecteddateA; //ok:基类的保护成员在派生类中为保护成员
  22. b=publicdateA; //ok:基类的公共成员在派生类中为公共成员
  23. }
  24. };
  25. //////////////////////////////////////////////////////////////////////////
  26. class C :private A //基类A的派生类C(私有继承)
  27. {
  28. public:
  29. void funct()
  30. {
  31. int c;
  32. c=privatedateA; //error:基类中私有成员在派生类中是不可见的
  33. c=protecteddateA; //ok:基类的保护成员在派生类中为私有成员
  34. c=publicdateA; //ok:基类的公共成员在派生类中为私有成员
  35. }
  36. };
  37. //////////////////////////////////////////////////////////////////////////
  38. class D :protected A //基类A的派生类D(保护继承)
  39. {
  40. public:
  41. void funct()
  42. {
  43. int d;
  44. d=privatedateA; //error:基类中私有成员在派生类中是不可见的
  45. d=protecteddateA; //ok:基类的保护成员在派生类中为保护成员
  46. d=publicdateA; //ok:基类的公共成员在派生类中为保护成员
  47. }
  48. };
  49. //////////////////////////////////////////////////////////////////////////
  50. int main()
  51. {
  52. int a;
  53. B objB;
  54. a=objB.privatedateA; //error:基类中私有成员在派生类中是不可见的,对对象不可见
  55. a=objB.protecteddateA; //error:基类的保护成员在派生类中为保护成员,对对象不可见
  56. a=objB.publicdateA; //ok:基类的公共成员在派生类中为公共成员,对对象可见
  57. C objC;
  58. a=objC.privatedateA; //error:基类中私有成员在派生类中是不可见的,对对象不可见
  59. a=objC.protecteddateA; //error:基类的保护成员在派生类中为私有成员,对对象不可见
  60. a=objC.publicdateA; //error:基类的公共成员在派生类中为私有成员,对对象不可见
  61. D objD;
  62. a=objD.privatedateA; //error:基类中私有成员在派生类中是不可见的,对对象不可见
  63. a=objD.protecteddateA; //error:基类的保护成员在派生类中为保护成员,对对象不可见
  64. a=objD.publicdateA; //error:基类的公共成员在派生类中为保护成员,对对象不可见
  65. return 0;
  66. }

摘抄自:http://www.cnblogs.com/qlwy/archive/2011/08/25/2153584.html

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注