|
一、类的组合关系: 1、整体与部分的关系 组合关系,从字面上来理解的话,就是谁也离不开谁,必须相互组合在一起才行,例如我们生活当中的电脑组成:
代码示例: #include <iostream>#include <string>1 h/ l$ [) I! M6 I/ ` 8 p, M$ |; N" P, w using namespace std;. k, q6 ?+ A5 U5 W class Memory {6 {. b: U% ~ N) Y public: Memory()& V) R8 O. X3 x2 p6 c7 ]) o; F { cout << "Memory()" << endl;6 {& z) H% _- T5 ]- w6 u! h& R } ~Memory() {" H- J! u5 k0 a) _ cout << "~Memory()" << endl;, Q3 `& D- T# s7 N2 l } }; 0 L3 R8 V8 ^4 R9 p8 H) u class Disk { public:2 H/ u. m' Z% J7 T$ { Disk() {3 ?+ h! j* |6 B& w; { cout << "Disk()" << endl; }) V3 n, \4 n; @: [# q" s1 M ~Disk() { cout << "~Disk()" << endl;" {# m8 m. ^( i+ G! s) q } 8 B0 R& V; i7 `" n7 y. z& m }; class CPU: k# C( a; w) I) f { public: CPU() {$ t) c) i8 Y4 }/ _ cout << "CPU()" << endl; } 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; } }; class MainBoard {( x9 s7 T, ^/ P0 H3 d# x public: MainBoard() {" 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() {: ^4 p4 _" O: H7 ]# V# G3 p* S cout << "~MainBoard()" << endl;: L$ u0 f& [0 v } ! d* B" n% S1 f, C2 G$ K }; class Computer // 这个地方不仅描述了事物,也还描述了关系,里面只要有一个类不存在,电脑这个类也就不复存在了。 {* 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; MainBoard mMainBoard; public: Computer()// 这里会先调用类成员的构造函数,之后调用电脑类的构造函数,这说明了组合关系;电脑类对象的创建,要依赖上述四个类的对象的创建。 { 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 { cout << "power()" << endl; }+ h3 m: m6 ?2 J9 l g) i; N+ I: u void reset()* U; G) r c" z { cout << "reset()" << endl;7 V4 G; i" r% J/ \& n# I } ~Computer()// 电脑类析构的时候,也会将对应的类成员析构,这说明同生死;说明了电脑类对象的存在完全依赖于类成员对象的存在。 {$ f4 A- Y; W4 t1 M {+ Y3 z$ E& @) \$ q: h* } cout << "~Computer()" << endl; }; S8 ^! ]; m5 s* h }; ' ]' X. L" D0 r) I, r0 S int main() { 1 x+ S3 n- p( E- h Computer c; 9 E* S8 }4 b$ [) T8 n4 | return 0; }3 ^+ a( u7 u8 N: o( h" q( Q 运行结果: root@txp-virtual-machine:/home/txp# ./a.outMemory() Disk()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() ~CPU()$ e" f& c/ W0 |4 q7 n ~Disk() ~Memory()3 p* d9 X. d, L 2、组合关系的特点:
二、类的继承关系: 说到这个继承,你可以把它类比成生活当中的父亲和儿子,儿子继承的父亲的长相特征。那么在我们面向对象中继的承又是指什么呢? 1、面向对象中的继承是指类之间的父子关系
2、继承代码描述形式: class Parent# k& j/ t# ~3 k! t; D{ int mv; public: void method()7 {( q. a9 t' H {' q, y8 h5 G; \1 X2 ]# Y: k& T ! D5 y% Z, }/ X7 K2 ~ } };! _+ Q2 b/ r0 ^7 K# L class Child : public Parent//描述继承关系 {, O O' ^% g3 E: r; l };9 y! T. o7 |* k6 Y s 代码示例: #include <iostream>#include <string>, P d0 m2 c! ]: W8 R 5 G1 V0 J% E; u+ C using namespace std; class Parent {3 r. M) h& O- b' J) T int mv; public: Parent()! c' `8 i% q( f- \ {/ s& p2 m) O* G* E cout << "Parent()" << endl;& h, W# z( Q, s6 | mv = 100; } void method()2 R$ m+ x( I: z" T. o r# A { cout << "mv = " << mv << endl;8 V) R9 P" y) ?" Y* N } }; class Child : public Parent { public: void hello() { cout << "I'm Child calss!" << endl; }' a" ~0 W4 c- G0 o, e8 | }; 0 l/ @: E9 o. |/ s& L int main() { Child c; , y" U' I* J! R c.hello(); c.method();! J: X2 C' B5 P" W return 0; } : `* J/ n9 p% l% o# C 运行结果: root@txp-virtual-machine:/home/txp# ./a.out$ i) \- ~4 @2 D9 y* e5 p9 _' ^$ sParent()$ w% o4 K4 _/ u6 G& I! v, g* E I'm Child class! mv= 10 . p/ ?+ b. V% _ 3、继承规则:
说明:继承是c++中代码复用的重要手段。通过继承,可以获得父类的所有功能,并且可以在子类中重写已有的功能,或者添加新功能。 代码示例: #include <iostream>#include <string> using namespace std; & z6 C. N$ b4 i4 M. W* [' n: X class Memory* L; r" ]* q6 N- W7 m { public: Memory()9 T: @0 d" `6 j+ P% O { cout << "Memory()" << endl; }2 F1 q0 r. Z2 _, q" L b8 M ~Memory(). P0 O3 _7 X5 Y8 g0 K7 s { cout << "~Memory()" << endl;3 a( t& }, f, z) T# n( T9 F5 K6 b }, j2 s! R0 N" a S' \ }; class Disk3 N# o" z: W X8 [; G$ ?& S8 x { public:) i& `4 j9 E% [ Disk() {( T8 f" \& e5 B cout << "Disk()" << endl;; P/ x+ ~# P& [3 z! m. _# O: W1 h }( I% n. K0 ?4 w: y ~Disk() { cout << "~Disk()" << endl;0 \ n7 }4 P/ L; q7 A, s } };! L; s( |' U3 B7 J 6 w, l) W( J! P7 A5 d! w class CPU {; x0 R+ l% `8 W' O. m3 b4 L public: 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() {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 }; class MainBoard3 g' e( ?, r% I) E { public:+ e( b; p0 {; \: ] MainBoard()% ~# a& _4 {( D- ]3 M$ Y { cout << "MainBoard()" << endl; } {3 x" {/ P( ?6 \! _( g ~MainBoard()* }" h+ r; c" j, Z) s {* y3 w7 h# t$ B: F# | b cout << "~MainBoard()" << endl; } ( r, h# u# C3 i% C };1 d2 f8 \1 F$ m! i5 _% m class Computer { Memory mMem; Disk mDisk; CPU mCPU;7 S% i% w4 c- @ { MainBoard mMainBoard; public:8 l7 L0 v1 t2 ` Computer() { cout << "Computer()" << endl; }1 v8 O' O$ f) l, U0 X void power() {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() {8 z8 w4 u- {& Q" L* v cout << "reset()" << endl; }& O6 p. t6 b- O+ |! o ~Computer() {& z! i. z9 \) o+ S cout << "~Computer()" << endl; } };. K! B8 i% R" L* y% K7 x! o class HPBook : public Computer. r% C9 x- R, a) B2 S* M {7 v# a- Y9 ]" t) } U string mOS; public:* \3 x* c4 j8 [4 X# k HPBook() { mOS = "Windows 8"; }- |( |2 k e) O$ R+ \- M void install(string os) { mOS = os; } void OS()+ S5 B3 S( z' a: A5 O {3 W/ y' e! u3 n% {0 R cout << mOS << endl; }+ w/ R2 k3 X* u) v8 \- b0 i0 X }; 2 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() {6 a) `. S5 C, X; x' k: ]& y+ @ cout << "Mac OS" << endl; }" U2 p5 `9 U* L q/ Z B$ M }; $ C A8 E/ S3 ~" H# J, Z int main()% R# D6 C# f0 v# V { HPBook hp; " Q, q) {& f4 Y6 ?. X" V hp.power();/ v( O- I3 A: L# h$ i. k& \. ? hp.install("Ubuntu 16.04 LTS"); hp.OS();8 V. p$ H' O. x cout << endl; MacBook mac;8 [% E1 c3 e* N' s. R3 _8 g $ ^* G4 R2 y- @* t7 N mac.OS(); * p) A& L4 O8 G# L. I! S return 0; }, J8 H6 I: i1 s7 k3 t9 f3 L [ 运行结果: root@txp-virtual-machine:/home/txp# ./a.out/ b/ n# S k5 I. y7 A: RMemory() Disk()0 m- s# ]8 V8 L @. P0 R! ^ CPU(); Y( C7 G% X. @$ ~! c: J MainBoard() Computer() power() Ubuntu 16.04 LTS Memory()) @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() Computer() Mac OS ~Computer() ~MainBoard()8 Q0 l# z) u6 l5 f+ l ~CPU() ~Disk()' V: {- L, W( K. J# _+ z- U# X ~Memory() ~Computer() ~MainBoard() ~CPU() ~Disk(); B3 o5 I' K; f" d, |& ^ ~Memory() 4、小结:
三、总结: 好了,今天的分享就到这里,如果文章中有错误或者不理解的地方,可以交流互动,一起进步。 |
微信公众号
手机版