geniusgogo

导航

浅谈C++中三种继承关系

成员属性有三种: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(intint);
 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;
 34 }
 35 
 36 void Base::sety(int y)
 37 {
 38     this->= y;
 39 }
 40 
 41 void Base::setz(int z)
 42 {
 43     this->= 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(23);
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

posted on 2010-09-05 17:58  geniusgogo  阅读(1097)  评论(0编辑  收藏  举报