在面向对象的语言里面,出现了类的概念。这是编程 思想 的一种进化。所谓类:是对特定数据的特定操作的集合体。所以说类包含了两个范畴:数据和操作。而C语言中的struct仅仅是数据的集合。
$ i6 f: ^$ ]6 d9 E8 d4 N6 o+ Z. g$ L2 Z1 [5 Y7 y3 w% B7 K# C
1.实例:下面先从一个小例子看起 1 y% B4 ` f: t( i2 {+ s/ i
$ m) u; c+ M9 b7 o D#ifndef C_Class 4 Q; R0 w6 k$ r
#define C_Class struct
/ w5 X$ b E+ ^#endif
/ r" M @' b0 W3 e( K% o+ M+ l3 U' k% A8 q- \! N1 t$ M
C_Class A {
- Q* _; O" w8 E; T6 ~% WC_Class A *A_this;
2 f9 O! w! s4 T/ U# bvoid (*Foo)(C_Class A *A_this);
" M8 K6 R% a( ?% N3 @! Z. a& m0 B) cint a;
! Z( _: t$ @2 L) Y7 gint b;
; M, x' O$ C. \}; 2 K8 M. l5 [! {+ @9 ?! I
- [; U2 x+ Q4 }
C_Class B{ //B继承了A
* N7 r& j9 p. E# B) ?1 xC_Class B *B_this; //顺序很重要 ' s! p+ T( D& f D7 A7 M' W
void (*Foo)(C_Class B *Bthis); //虚函数 " c0 t. `- Q4 ?! t* k
int a; 6 H ]) g( E$ F
int b;
1 z6 @/ A( ?) Q: A# i; F
- y& W& a$ ?# b9 Rint c;
2 I" b, U5 ]$ @' y, \) o5 s};
$ a2 M# }! T( q& p& ~/ ]2 ~& X
( h3 H2 q" Q' S& J" D1 R( C7 Z
" b, ~- ?3 o- e" o1 b& W2 O- Yvoid B_F2(C_Class B *Bthis)
% w4 g z: d3 L- `+ z{
! L* ~% Z8 z% V2 Fprintf("It is B_Fun ");
1 p9 g+ ~- }' \2 U0 J- }2 p}
9 i# P A$ ^( D% Z
7 ], r: z4 W' A2 P# ^void A_Foo(C_Class A *Athis)
3 |) ` t4 @& F3 P; A+ H: y0 _{ 3 ^( [ m8 k9 w+ Y$ b; [9 i
printf("It is A.a=%d ",Athis->a);//或者这里
" E0 [( t6 n/ ~* s1 M// exit(1); 2 T0 Y! Z" P$ `( l
// printf("纯虚 不允许执行 ");//或者这里 + u4 |" S" o( o: D2 V. J1 M
}
6 A. m6 I7 U ]) k" c4 O' X
( a( K/ _0 e9 O- M- v& cvoid B_Foo(C_Class B *Bthis)
6 O8 _ ~4 ?; V4 k{ 1 H4 |; t; m$ f3 b6 N
printf("It is B.c=%d ",Bthis->c); . a& P, W' w% v. ?
}
! l; T. |% Y% F; ]! D/ L
* E/ ]8 n/ w; U; v/ D3 @void A_Creat(struct A* p)
# D) J7 n: h4 e2 M B# J4 o{
9 K. q/ T; y! L3 J. k+ e4 q8 K4 Zp->Foo=A_Foo; 1 n: p8 T" \/ P: L
p->a=1; 1 Q' W# L% @6 i9 E+ t. m7 h
p->b=2; $ r" e0 M2 m7 P% K
p->A_this=p;
6 N' a, a6 J) T} 2 F* h3 g' Q3 A: ~) \7 F5 ^5 F
: f7 o5 ~+ a& Z6 `- `5 d3 C! @& L! r7 r/ B
void B_Creat(struct B* p)
2 k# b* l$ x% N9 u{
: q7 c( ?+ D3 Y, X0 H' D, ep->Foo=B_Foo; ' i% z7 r6 g& a0 C' D! I7 v
p->a=11; v2 q+ W& `/ O/ O6 U) e
p->b=12;
4 Z- n+ H( _0 E Ap->c=13;
8 i( o4 R7 }6 |$ U" Wp->B_this=p;
% T( I6 |8 { t9 P5 z4 I9 ^- m g1 \}
8 ] \4 @0 m. T/ Y
& B. I& ?4 o# P9 {5 e8 a' D. Y0 J
0 W' g$ \6 f: r0 x, ^/ ]. t4 F+ p7 c! Sint main(int argc, char* argv[]) 1 U- i& S/ t+ n8 I
{
; S$ h* {0 D. [' a" Z; e( ZC_Class A *ma,a;
0 k1 G+ F$ D a8 y" R7 ?+ Z6 lC_Class B *mb,b;
6 z4 p' u6 N4 x$ v, p- y9 }8 |$ Y/ w( _; K
A_Creat(&a);//实例化 $ F/ u$ u! q0 m" t% p+ u( r
B_Creat(&b);
' X4 e8 m) t3 p- T- } L9 P$ g0 H8 R& D; L" q, d( Q" t
mb=&b;
) O. K) P# q# E* V9 f! k* Ima=&a;
2 ?/ C8 J) y: B; \5 K
' j" w. }. Z' Gma=(C_Class A*)mb;//引入多态指针
5 z/ l4 @2 \3 x. n/ S0 j6 B& Gprintf("%d ",ma->a);//可惜的就是 函数变量没有private
. `0 ]; p5 `! S+ ?- ]ma->Foo(ma);//多态
/ J: k4 s! [3 u8 W0 ua.Foo(&a);//不是多态了
) I) @: X( n! K) iB_F2(&b);//成员函数,因为效率问题不使用函数指针 ' D' e- q3 s8 C
return 0; 5 p1 W( _2 U3 J; l
}
, I; a, [2 E, S. K" T- s8 d/ |2 ^输出结果: 6 @$ b5 p2 D( P# U
11 : c* O( _$ Z& U% p4 v g1 d
It is B.c=13
2 o: P- H+ ?. k2 H( L* p; [: d- TIt is A.a=1 * a1 M, K5 C! w, ]5 v
It is B_Fun |