浅谈C++中三种继承关系
时间:2010-09-05 来源:......布之
成员属性有三种:private,protected,public;在类的继承中依然是这三种属性;(暂停一下,刚有看到一个人的帖子,有受打击,差点崩溃)
private继承中,派生类在拥有父类的所有成员后,会对继承下来的成员修改它们的属性,既将所有属性全部变成private;由此一来在派生类的外部代码中不能访问从父类继承过来的成员了,即使之前在父类中是public属性也不行;然而之前是public和protected的属性成员在变成private之后又跟之前在父类就是private属性的成员有区别,区别就是派生类可以在类代码中访问由public和protected属性转换过来的private成员,但是不能直接访问之前在父类就是private属性的成员;这三种继承中有以共同特点就是——要想访问原本就是private属性的成员,则必须通过继承过来的原本在父类是非private属性的接口才可以;
public继承,这种继承完全不改变之前父类中的属性,被继承过来的成员依然保留在父类的属性;然而还是要遵循前面提到的三种继承中的共同特点——要想访问原本就是private属性的成员,则必须通过继承过来的原本在父类是非private属性的接口才可以;
protected继承,也会修改从父类继承过来的属性,但是他只会将public属性的成员修改为protected成员;这样一来派生类外部代码就不能操作继承来的由public属性转换成protected属性的成员了;现在对于外部来说派生类中继承过来的成员都是受保护类型成员;
说了这么多概念性的东西,还是依照前例给出样例代码吧:(公有继承样例)
代码 1 #include <iostream>
2
3 using namespace std;
4
5 class Base{
6 public:
7 int x;
8 Base();
9 void setx(int);
10 int getx(void);
11 int gety(void);
12 int getz(void);
13 void show(void);
14 void setInterface(int, int);
15 private:
16 int y;
17 void sety(int);
18 protected:
19 int z;
20 void setz(int);
21 void setInterface(int);
22 };
23
24 Base::Base()
25 {
26 x = 0;
27 y = 0;
28 z = 0;
29 }
30
31 void Base::setx(int x)
32 {
33 this->x = x;
34 }
35
36 void Base::sety(int y)
37 {
38 this->y = y;
39 }
40
41 void Base::setz(int z)
42 {
43 this->z = z;
44 }
45
46 void Base::show(void)
47 {
48 cout << x << " " << y << " " << z << endl;
49 }
50
51 void Base::setInterface(int y)
52 {
53 sety(y);
54 }
55
56 void Base::setInterface(int y, int z)
57 {
58 sety(y);
59 setz(z);
60 }
61
62 int Base::getx(void)
63 {
64 return x;
65 }
66
67 int Base::gety(void)
68 {
69 return y;
70 }
71
72 int Base::getz(void)
73 {
74 return z;
75 }
76
77 class Derived_A:public Base{
78 int sum;
79 public:
80 void show(void);
81 void setSum(Base &);
82 Derived_A();
83 };
84
85 Derived_A::Derived_A()
86 {
87 sum = 0;
88 }
89
90 void Derived_A::show(void)
91 {
92 cout << getx() << " + " << gety() << " + "
93 << getz() << " = " << sum << endl;
94 }
95
96 void Derived_A::setSum(Base &b)
97 {
98 setx(b.x + 1); //公有成员直接访问
99 //sety(b.y) 不能直接访问继承过来的private属性成员
100 setInterface(b.gety() + 2);//private属性可以通过父类的非private接口去访问
101 setz(b.getz() + 3);//可以访问非private属性成员
102 sum = getx() + gety() + getz();
103 }
104
105 int main()
106 {
107 Base b;
108 b.setx(1);
109 b.setInterface(2, 3);
110 b.show();
111 Derived_A a;
112 a.setSum(b);
113 a.show();
114
115 return 0;
116 }
117
118 /***************************************************************************************************************
119
120 **********由于篇幅和时间关系,其他两个样例就不写了。其实我很懒,O(∩_∩)O~.........***********
121
122 ***************************************************************************************************************/
123
~~~~~~~~~~~~~~~~~~~~听妈妈的话~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~天天向上~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~天才,没有一个伟大的心灵不带一粒疯狂的种子!~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~