浅谈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属性的成员了;现在对于外部来说派生类中继承过来的成员都是受保护类型成员;

说了这么多概念性的东西,还是依照前例给出样例代码吧:(公有继承样例)

浅谈C++中三种继承关系浅谈C++中三种继承关系代码1#include<iostream>

2

3usingnamespacestd;

4

5classBase{

6public:

7intx;

8Base();

9voidsetx(int);

10intgetx(void);

11intgety(void);

12intgetz(void);

13voidshow(void);

14voidsetInterface(int,int);

15private:

16inty;

17voidsety(int);

18protected:

19intz;

20voidsetz(int);

21voidsetInterface(int);

22};

23

24Base::Base()

25{

26x=0;

27y=0;

28z=0;

29}

30

31voidBase::setx(intx)

32{

33this->x=x;

34}

35

36voidBase::sety(inty)

37{

38this->y=y;

39}

40

41voidBase::setz(intz)

42{

43this->z=z;

44}

45

46voidBase::show(void)

47{

48cout<<x<<""<<y<<""<<z<<endl;

49}

50

51voidBase::setInterface(inty)

52{

53sety(y);

54}

55

56voidBase::setInterface(inty,intz)

57{

58sety(y);

59setz(z);

60}

61

62intBase::getx(void)

63{

64returnx;

65}

66

67intBase::gety(void)

68{

69returny;

70}

71

72intBase::getz(void)

73{

74returnz;

75}

76

77classDerived_A:publicBase{

78intsum;

79public:

80voidshow(void);

81voidsetSum(Base&);

82Derived_A();

83};

84

85Derived_A::Derived_A()

86{

87sum=0;

88}

89

90voidDerived_A::show(void)

91{

92cout<<getx()<<"+"<<gety()<<"+"

93<<getz()<<"="<<sum<<endl;

94}

95

96voidDerived_A::setSum(Base&b)

97{

98setx(b.x+1);//公有成员直接访问

99//sety(b.y) 不能直接访问继承过来的private属性成员

100setInterface(b.gety()+2);//private属性可以通过父类的非private接口去访问

101setz(b.getz()+3);//可以访问非private属性成员

102sum=getx()+gety()+getz();

103}

104

105intmain()

106{

107Base b;

108b.setx(1);

109b.setInterface(2,3);

110b.show();

111Derived_A a;

112a.setSum(b);

113a.show();

114

115return0;

116}

117

118/****************

119

120
*由于篇幅和时间关系,其他两个样例就不写了。其实我很懒,O(∩_∩)O~.........**

121

122
****************/

123原文链接: https://www.cnblogs.com/accepted/archive/2010/09/05/1818525.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/14718

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午2:27
下一篇 2023年2月7日 下午2:27

相关推荐