你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

C++——类的继承关系学习

[复制链接]
gaosmile 发布时间:2020-8-18 18:09
一、类的组合关系:
1、整体与部分的关系
组合关系,从字面上来理解的话,就是谁也离不开谁,必须相互组合在一起才行,例如我们生活当中的电脑组成:
微信图片_20200818180902.png
代码示例:
#include <iostream>
& t2 ^# C* J+ d5 Q7 F/ j#include <string>1 h/ l$ [) I! M6 I/ `
8 p, M$ |; N" P, w
using namespace std;. k, q6 ?+ A5 U5 W

) R7 {7 N; v# l$ @5 cclass Memory
' D, c# w- L6 `0 _; [5 t" }{6 {. b: U% ~  N) Y
public:
4 n' o  L0 F) y( U    Memory()& V) R8 O. X3 x2 p6 c7 ]) o; F
    {
6 h6 T, [1 f2 d) [( T* i        cout << "Memory()" << endl;6 {& z) H% _- T5 ]- w6 u! h& R
    }
7 q5 A7 f" V" ^$ d' \+ y    ~Memory()
/ ^5 i0 Y6 X* n* d5 B  b7 t+ ?    {" H- J! u5 k0 a) _
        cout << "~Memory()" << endl;, Q3 `& D- T# s7 N2 l
    }
: D. U* s% x; a" k& d};
4 \; q) a& \* x" p5 L$ A% y0 L3 R8 V8 ^4 R9 p8 H) u
class Disk
7 C5 t: D0 l4 m8 U9 l% x) O{
$ R9 f6 n6 v7 {5 \public:2 H/ u. m' Z% J7 T$ {
    Disk()
& B1 i7 a/ H$ Q    {3 ?+ h! j* |6 B& w; {
        cout << "Disk()" << endl;
5 q8 g) z" ?  j0 m1 B1 e9 @3 x    }) V3 n, \4 n; @: [# q" s1 M
    ~Disk()
  K  D& J! @1 @    {
1 k1 x7 u* m7 t  n3 s/ ^        cout << "~Disk()" << endl;" {# m8 m. ^( i+ G! s) q
    }   8 B0 R& V; i7 `" n7 y. z& m
};
* l; `6 |/ I  `+ Z4 p5 B1 p
$ P6 {: N: Z& s$ Eclass CPU: k# C( a; w) I) f
{
& ~9 j' O8 e3 ^8 P( R  D+ j) Npublic:
4 Y% N0 v# s7 G7 u    CPU()
4 B9 Y. g% g' e# }1 Y: h3 T    {$ t) c) i8 Y4 }/ _
        cout << "CPU()" << endl;
3 }0 W/ a+ m4 ?" G5 H0 c3 ~    }  l3 l. B4 K4 _. h3 O% y* [' w6 h
    ~CPU()/ g! T* B9 f' z: Z3 h( L( n3 v4 k
    {4 `: d4 {' _% X: c) v. Z
        cout << "~CPU()" << endl;
: L+ a4 P+ A4 e2 A0 Y# c    }   
+ p1 |. N8 Q; Z, J# j};
, H. U3 @* M2 n
: H+ h9 i0 {& v% sclass MainBoard
) C& n( {; h+ d0 T% Q{( x9 s7 T, ^/ P0 H3 d# x
public:
) \/ P& E7 \" u- j; O    MainBoard()
3 a% S( U3 e9 X8 l8 c1 A    {" I9 k- |4 @: J* @( u- ]" u
        cout << "MainBoard()" << endl;2 d" P& Y; @: O# A& a
    }4 u" Y: }4 v1 e& g* f
    ~MainBoard()
1 X- f4 h, I8 |5 U2 x    {: ^4 p4 _" O: H7 ]# V# G3 p* S
        cout << "~MainBoard()" << endl;: L$ u0 f& [0 v
    }    ! d* B" n% S1 f, C2 G$ K
};
4 S/ q" x: R4 v: j9 N9 O. n
2 |, I" n* n8 I0 \& L; @  ~( Wclass Computer // 这个地方不仅描述了事物,也还描述了关系,里面只要有一个类不存在,电脑这个类也就不复存在了。
) g7 Y  j3 N9 P* t) C{* v! v5 O0 n! q' b3 x: G4 o1 X7 s
    Memory mMem;6 P6 b7 H6 L( L
    Disk mDisk;6 J3 z- t. Q9 E" e3 }% k
    CPU mCPU;
. t( E3 r1 \. m8 ]7 o    MainBoard mMainBoard;
) d5 w4 o( J+ {8 `  rpublic:
4 j% X0 w! m0 ?9 @, l$ G    Computer()// 这里会先调用类成员的构造函数,之后调用电脑类的构造函数,这说明了组合关系;电脑类对象的创建,要依赖上述四个类的对象的创建。
+ S5 \: D2 t( t, t7 r2 W8 s    {
: i. J: i& Q7 W. l        cout << "Computer()" << endl;4 g6 [; [4 G5 j+ x; X
    }) ^! Q4 [. K+ P. D! `( J5 [& z, {
    void power(), g* Y8 f& y( B, j/ O
    {
7 R# a7 ^9 ?! R/ h* s$ |        cout << "power()" << endl;
5 D/ k/ x# X2 Y* g7 v: O7 t    }+ h3 m: m6 ?2 J9 l  g) i; N+ I: u
    void reset()* U; G) r  c" z
    {
( q5 Q& X$ h" t0 A0 x  y        cout << "reset()" << endl;7 V4 G; i" r% J/ \& n# I
    }
' Y: j) S0 A* D    ~Computer()// 电脑类析构的时候,也会将对应的类成员析构,这说明同生死;说明了电脑类对象的存在完全依赖于类成员对象的存在。
4 m% b* \  y1 W     {$ f4 A- Y; W4 t1 M
    {+ Y3 z$ E& @) \$ q: h* }
        cout << "~Computer()" << endl;
" e( N4 Y$ H6 G8 o- l2 [  @$ K; Q    }; S8 ^! ]; m5 s* h
};
9 a" z6 I$ A$ e: Z' ]' X. L" D0 r) I, r0 S
int main()
7 w4 |8 y1 c" N, ^' o{   1 x+ S3 n- p( E- h
    Computer c;
: F4 h9 j. A+ C3 G  m    9 E* S8 }4 b$ [) T8 n4 |
    return 0;
- |( W, K* M2 f8 q  _# Z0 y}3 ^+ a( u7 u8 N: o( h" q( Q

' o. `0 G5 w9 }/ S/ [/ n8 _
运行结果:
root@txp-virtual-machine:/home/txp# ./a.out
& t% z( y; \* R/ s# j# v. Y5 W% jMemory()
; c$ n; Z( y) XDisk()5 y, ?6 S. H' r" i
CPU()) [% D3 A6 I- U
MainBoard()9 K! ^" O  w- V
Computer()( o/ a6 j+ ]+ z$ O& j0 @
~Computer()- R. [+ G7 M  J$ m- w2 T! Z
~MainBoard()
, s/ [  d; _$ K1 L~CPU()$ e" f& c/ W0 |4 q7 n
~Disk()
- o+ t( W) C" \% K0 X1 A: B~Memory()3 p* d9 X. d, L

" W9 Y# l9 f  e7 [
2、组合关系的特点:
  • 将其它类的对象作为当前类的成员使用
  • 当前类的对象与成员对象的生命周期相同
  • 成员对象在用法上与普通对象完全一致

    & k6 V2 M6 }2 s; @  ~( s/ f
二、类的继承关系:
说到这个继承,你可以把它类比成生活当中的父亲和儿子,儿子继承的父亲的长相特征。那么在我们面向对象中继的承又是指什么呢?
1、面向对象中的继承是指类之间的父子关系
  • 子类拥有父类的所有属性和行为
  • 子类就是一种特殊的父类
  • 子类对象可以当作父类对象使用
  • 子类中可以添加父类中没有的方法和属性

    3 {1 d! f7 p, }2 U3 e7 h7 w  Z
2、继承代码描述形式:
class Parent# k& j/ t# ~3 k! t; D
{
3 \! W: h' a$ P& d# C0 ?4 C2 Y    int mv;
5 c0 I; w  d  r' P' k, _  public:
8 C1 F$ K/ ^' Z; v" ^, n+ k- U    void method()7 {( q. a9 t' H
    {' q, y8 h5 G; \1 X2 ]# Y: k& T
    ! D5 y% Z, }/ X7 K2 ~
    }
" B  ?+ g' Z- _9 R) t9 k4 T};! _+ Q2 b/ r0 ^7 K# L
class Child : public Parent//描述继承关系
& h3 B% E3 N7 e- {* I- n2 L* E# Q{, O  O' ^% g3 E: r; l

2 y) [$ }6 B; e/ B5 ~3 ^% S};9 y! T. o7 |* k6 Y  s
代码示例:
#include <iostream>
' n4 F( p& g; _) I7 o#include <string>, P  d0 m2 c! ]: W8 R
5 G1 V0 J% E; u+ C
using namespace std;
1 @0 v4 [  a! j) s( x4 |
& o" z" [& O1 q  O& w/ Bclass Parent
2 Q/ m* D# E, Y& g( T{3 r. M) h& O- b' J) T
    int mv;
! s0 g, n5 F5 `: I- N9 }* j( ?public:
: l. ~9 o* P2 Z. f. A    Parent()! c' `8 i% q( f- \
    {/ s& p2 m) O* G* E
        cout << "Parent()" << endl;& h, W# z( Q, s6 |
        mv = 100;
% N' C  @/ @6 h7 g    }
! Y, k' r3 ]$ g* F0 M    void method()2 R$ m+ x( I: z" T. o  r# A
    {
6 ]8 R- C+ i& U9 F        cout << "mv = " << mv << endl;8 V) R9 P" y) ?" Y* N
    }
2 @$ J9 a9 |, t" _8 M};
* M; @# T1 D" |' H& s
' V9 `2 Q  A: k9 Q% A* Oclass Child : public Parent
; Y( ^6 r5 Z' ~$ u# m- f4 A) H8 @+ r{
& `5 r4 F; I; dpublic:
& [0 n4 N2 u) W& W& I1 f+ a    void hello()
. X; E3 J0 _$ r& i3 e    {
  N( R( W) d, I6 u3 h        cout << "I'm Child calss!" << endl;
6 ~9 F+ i+ i2 ^: ]; L    }' a" ~0 W4 c- G0 o, e8 |
};
: }: H9 t) g  n. X0 l/ @: E9 o. |/ s& L
int main()
+ S; p* D  o- B' F* r" A  l4 ^) u{   
( b+ _" A, }5 P* |( C    Child c;
+ c- F7 }/ d& U0 L    , y" U' I* J! R
    c.hello();
: c" Q4 z& u3 ]! V% ^    c.method();! J: X2 C' B5 P" W
   
$ K- o4 A% p3 [# f( J    return 0;
: ?  }+ p' l% Y% r* X" E}
! D: G7 k  b' L3 O& w: `* J/ n9 p% l% o# C
运行结果:
root@txp-virtual-machine:/home/txp# ./a.out$ i) \- ~4 @2 D9 y* e5 p9 _' ^$ s
Parent()$ w% o4 K4 _/ u6 G& I! v, g* E
I'm Child class!
* `; g  {! e0 ~mv= 10
2 `4 o; u- a+ p+ Q# v. p/ ?+ b. V% _
3、继承规则:
  • 子类就是一个特殊的父类
  • 子类对象可以直接初始化父类对象
  • 子类对象可以直接赋值给父类对象
    . Z, D/ I) D' h" i& i
说明:继承是c++中代码复用的重要手段。通过继承,可以获得父类的所有功能,并且可以在子类中重写已有的功能,或者添加新功能。
代码示例:
#include <iostream>
8 q7 z7 x% A5 _5 p, e( ~( S#include <string>
) q* V; F. R; K5 n/ a
5 t! `( }1 N2 O: {0 o" _) Vusing namespace std;
. V( C/ [/ o3 F1 }1 Y: t/ T6 [6 l# {6 a& z6 C. N$ b4 i4 M. W* [' n: X
class Memory* L; r" ]* q6 N- W7 m
{
: p4 `: o2 n  K( ~! Tpublic:
: d  e( S. `2 Z2 J7 t6 B. c    Memory()9 T: @0 d" `6 j+ P% O
    {
/ x  z) r) M! Q1 U  g& ^3 v- H        cout << "Memory()" << endl;
" R5 _$ F2 G4 j; g  Y; W    }2 F1 q0 r. Z2 _, q" L  b8 M
    ~Memory(). P0 O3 _7 X5 Y8 g0 K7 s
    {
/ x3 h1 V% m* m  u" K, s        cout << "~Memory()" << endl;3 a( t& }, f, z) T# n( T9 F5 K6 b
    }, j2 s! R0 N" a  S' \
};
5 n3 l$ X9 l  F# y
# `* o( ^- ?5 s' R" N9 Pclass Disk3 N# o" z: W  X8 [; G$ ?& S8 x
{
2 j0 e- D+ |6 fpublic:) i& `4 j9 E% [
    Disk()
% t9 G' u  r# v5 q    {( T8 f" \& e5 B
        cout << "Disk()" << endl;; P/ x+ ~# P& [3 z! m. _# O: W1 h
    }( I% n. K0 ?4 w: y
    ~Disk()
# }2 S- G$ H+ y# U, Y! s    {
  W9 ^3 M" h0 D) A5 p        cout << "~Disk()" << endl;0 \  n7 }4 P/ L; q7 A, s
    }   
+ F& ?5 Z  j2 U& c, `) p6 T# C% c  E};! L; s( |' U3 B7 J
6 w, l) W( J! P7 A5 d! w
class CPU
& f, ^, |* W) A" a{; x0 R+ l% `8 W' O. m3 b4 L
public:
& |" J! b8 }( T0 h" L    CPU(), X; u( w0 z( w  C2 M
    {4 y  g' F" N& o" F7 E9 B& j
        cout << "CPU()" << endl;1 N- O: \# P1 {. d% Z
    }; _" v! g4 S6 O. T* C- D! I! n+ J# y
    ~CPU()
! Y) `9 R% {* ]# `0 e+ v4 f    {3 E! w5 i/ d$ a' @$ ]' r
        cout << "~CPU()" << endl;3 E5 T7 C, C. a; m% W6 p* J1 s6 S: u
    }    * q% c' I/ K% @& v
};
2 @  ?! m0 O9 W. K: X
2 A$ i3 c( M, o  _class MainBoard3 g' e( ?, r% I) E
{
5 N# U' ~3 X. f9 P0 H' k% _# _+ ypublic:+ e( b; p0 {; \: ]
    MainBoard()% ~# a& _4 {( D- ]3 M$ Y
    {
9 d: r/ v$ F" j9 Z1 ?" K        cout << "MainBoard()" << endl;
/ c9 V& ~3 O* Z8 N: J    }  {3 x" {/ P( ?6 \! _( g
    ~MainBoard()* }" h+ r; c" j, Z) s
    {* y3 w7 h# t$ B: F# |  b
        cout << "~MainBoard()" << endl;
& J) X* r( g( u. ?    }    ( r, h# u# C3 i% C
};1 d2 f8 \1 F$ m! i5 _% m

$ y5 ~! p& a' ~0 b' m! Iclass Computer
) j# x% O, d1 x/ e{
( B5 W. b' B: B8 N' Z/ p: C    Memory mMem;
" v8 H, m) H, f, f6 s# j6 }    Disk mDisk;
+ b% V+ m  F3 i1 x; B    CPU mCPU;7 S% i% w4 c- @  {
    MainBoard mMainBoard;
: b  t# F( x* V: D1 X  h- Qpublic:8 l7 L0 v1 t2 `
    Computer()
! n: o# h$ |" p  X) D7 B    {
8 z% N+ E" ~) K/ i% X        cout << "Computer()" << endl;
. F/ ~* G# G' |& }2 p/ j9 j    }1 v8 O' O$ f) l, U0 X
    void power()
8 J! H& f) P) S# A    {6 x, e, m) x' m6 j. ~+ h1 C; P
        cout << "power()" << endl;3 N0 h* w6 H5 M9 |  E
    }1 [+ G/ a7 w! b4 E
    void reset()
$ ~2 ~: `# N% ?1 J. m9 L    {8 z8 w4 u- {& Q" L* v
        cout << "reset()" << endl;
, o- Y( ~% \* ^* v    }& O6 p. t6 b- O+ |! o
    ~Computer()
# k. H" K8 U2 t9 O4 l/ [    {& z! i. z9 \) o+ S
        cout << "~Computer()" << endl;
# G6 O# C7 {6 y  o. P3 l    }
9 h8 O' C* X8 g- [& [# h};. K! B8 i% R" L* y% K7 x! o

2 R' N+ X0 j5 t. f( Yclass HPBook : public Computer. r% C9 x- R, a) B2 S* M
{7 v# a- Y9 ]" t) }  U
    string mOS;
, _' v$ c+ j1 y# kpublic:* \3 x* c4 j8 [4 X# k
    HPBook()
" d( h* M9 K5 N+ u9 c0 `8 P! Y- Q4 C- ?    {
5 ^/ ~" Z4 k5 ?        mOS = "Windows 8";
& b% e. r7 E- o9 [( k+ [3 ^    }- |( |2 k  e) O$ R+ \- M
    void install(string os)
, `7 i  {3 @5 T    {
: J' j5 A: J( a- n+ z- G        mOS = os;
2 J" s, R5 ?' u4 G7 t1 R9 R8 ~    }
' b* q) P- ?: W7 k0 b5 ^6 m    void OS()+ S5 B3 S( z' a: A5 O
    {3 W/ y' e! u3 n% {0 R
        cout << mOS << endl;
$ p: l! z) s* G    }+ w/ R2 k3 X* u) v8 \- b0 i0 X
};
) P. m; d( s- w2 z# O& g8 W9 P/ l4 n" e4 d
class MacBook : public Computer$ i! x1 F; ^# {& ~2 B
{5 f+ b- @5 H% i$ S2 p1 F
public:1 }1 {! `* D& w; w3 {  {5 j1 }
    void OS()
, F$ V. D; u) s" Q+ Z( ^' k    {6 a) `. S5 C, X; x' k: ]& y+ @
        cout << "Mac OS" << endl;
7 U9 W/ B) O! H& Q: o7 P    }" U2 p5 `9 U* L  q/ Z  B$ M
};
, R* r9 B& u; @) F% W; O# d" _  X  g$ C  A8 E/ S3 ~" H# J, Z
int main()% R# D6 C# f0 v# V
{   
( v/ m+ x- J- n% c/ Y. M, K    HPBook hp;
  b& g- i2 L- j- D3 e3 n    " Q, q) {& f4 Y6 ?. X" V
    hp.power();/ v( O- I3 A: L# h$ i. k& \. ?
    hp.install("Ubuntu 16.04 LTS");
( D) i4 w2 r" N* \    hp.OS();8 V. p$ H' O. x
   
6 T3 N4 i6 S# d) E( v  e    cout << endl;
- z8 Y6 y3 R+ P: e   
# C9 G( h7 q3 {* z' q2 k- @5 f    MacBook mac;8 [% E1 c3 e* N' s. R3 _8 g
    $ ^* G4 R2 y- @* t7 N
    mac.OS();
! j% m6 n4 k, v% u  H6 H0 d2 d    * p) A& L4 O8 G# L. I! S
    return 0;
1 j( `; p5 `' N6 d4 E' `+ ~}, J8 H6 I: i1 s7 k3 t9 f3 L  [

# }3 d% F, S8 N* R3 L% e
运行结果:
root@txp-virtual-machine:/home/txp# ./a.out/ b/ n# S  k5 I. y7 A: R
Memory()
' Y& I, k: ?; _* \& M7 c( VDisk()0 m- s# ]8 V8 L  @. P0 R! ^
CPU(); Y( C7 G% X. @$ ~! c: J
MainBoard()
, k4 J/ _2 E% k% @2 u! e3 |Computer()
6 U0 [2 h+ {/ lpower()
5 k6 O6 T* ?$ r8 x- I/ a* OUbuntu 16.04 LTS
2 K! @: N! D9 e
" o5 H6 A1 c# [1 W5 n; _9 yMemory()) @8 G# b; W7 X
Disk()# r  ]% o0 }; o& p% l- L' P! F0 U
CPU()9 d4 n6 J  {# U  o' `4 v
MainBoard()
6 R4 f% Q& L3 G7 g  H  WComputer()
  [1 z! ~9 V+ `Mac OS
/ r9 K& Q% P) h) H~Computer()
" f/ d2 O% r# V8 ~~MainBoard()8 Q0 l# z) u6 l5 f+ l
~CPU()
. K* j& ~: I0 N' u. `$ t+ i~Disk()' V: {- L, W( K. J# _+ z- U# X
~Memory()
4 c; W; L$ ~9 y5 K% A) ?~Computer()
* J- ~9 H: X: W7 b~MainBoard()
- S9 o$ Y1 G+ a/ ^5 D~CPU()
# u5 E" a9 V! u' m~Disk(); B3 o5 I' K; f" d, |& ^
~Memory()
3 {+ \" @$ _  y: a9 `* {2 B! y
5 u; U" n( w: c6 h& {& @
4、小结:
  • 继承是面向对象中类之间的一种关系
  • 子类拥有父类的所有属性和行为
  • 子类对象可以当作父类对象使用
  • 子类中可以添加父类没有的方法和属性
  • 继承是面向对象中代码复用的重要手段(换句话说,就是不要去写重复的代码,提高工作效率)
    3 D8 w' q$ Y" k& S- n- S2 S
三、总结:
好了,今天的分享就到这里,如果文章中有错误或者不理解的地方,可以交流互动,一起进步。

' W% K6 B1 W8 w. ~
赞 收藏 评论0 发布时间:2020-8-18 18:09

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版