在面向对象的语言里面,出现了类的概念。这是编程 思想 的一种进化。所谓类:是对特定数据的特定操作的集合体。所以说类包含了两个范畴:数据和操作。而C语言中的struct仅仅是数据的集合。 ( Z5 y( d. d6 H. C: j1 S$ z/ A; h
+ [- M) W; U* K7 P4 R
1.实例:下面先从一个小例子看起 - O8 A' f" g+ _1 H
9 [" j' Y) x$ Z& r2 @9 M# Z#ifndef C_Class 4 M/ b& h3 R1 b3 |
#define C_Class struct 6 f l0 k n! b8 {
#endif
; @8 @, d& l. I0 p6 y
2 E' R; w" f; {1 G/ c" O( q$ zC_Class A { 0 d; F% l! M+ w# Z R8 X+ r
C_Class A *A_this; - K" g% {& r/ `' d! f
void (*Foo)(C_Class A *A_this);
3 @6 o. V: W! J" hint a;
6 Q# m0 Z/ |! b8 J7 L" Lint b; & z3 T, y' E5 J8 E! J% ?8 b1 b
}; 5 r: N& E2 m, H% w
t( a q. o$ H3 W2 i" |( y, lC_Class B{ //B继承了A
6 N' w# E! U! C, y, K* a2 pC_Class B *B_this; //顺序很重要 9 D; }4 z7 M* Y, l1 K9 i* x/ H
void (*Foo)(C_Class B *Bthis); //虚函数 " j- y4 T) n- `( @$ b& @
int a; 3 }. f2 @ B* t5 ~3 D
int b; 8 Z Y+ c7 _( Q% Q) e6 t( @* k
( `. U( ?0 `1 |* ]# c: ~% Q3 W5 Aint c; ! O# b3 t3 W: A) B
}; ' ?* u; k7 c9 p- r* x
j( [2 v' F _3 {2 Q7 |7 F0 _2 |( E7 Y9 X, t
void B_F2(C_Class B *Bthis) 8 I1 ^( E+ {3 h: u: F" }) U
{
8 n y+ ^8 a7 W) {; i# h- hprintf("It is B_Fun ");
0 q- `8 R$ X# e) q% w8 s: T} $ A7 [& Z- l& b H I' _
9 g( o9 ~1 M0 H+ J: L
void A_Foo(C_Class A *Athis) - W; n9 B! ]& W6 |9 O4 X" j0 d4 W& [
{ & G* d+ ^' A' Z# x- x
printf("It is A.a=%d ",Athis->a);//或者这里
- d& r" }0 ~6 [1 T4 y9 D$ I// exit(1);
; L( [% p% Z' B# M; @// printf("纯虚 不允许执行 ");//或者这里
5 l$ M4 T# {: n7 U; [& \2 x7 Y} 4 P" A$ l. s# M" I8 g" U% k. C% v
4 L+ ^6 v7 e9 l
void B_Foo(C_Class B *Bthis)
/ a+ }0 k+ v6 V, q" G2 J$ z{
: B% f5 y H: w$ }printf("It is B.c=%d ",Bthis->c);
9 o5 h2 C5 p" [} ) ] G# ]+ D* H4 H
. c9 I; u' |4 x) V B
void A_Creat(struct A* p) . E' X: a; f8 r2 x5 Z! L
{
' e7 d, Y4 |+ c5 `+ q* Up->Foo=A_Foo; 2 D8 _' S) X4 ] D4 Y' Z1 f
p->a=1; " \3 o2 O7 l- y% K# F
p->b=2; 9 |" |+ [" v3 R& i* _
p->A_this=p;
) w( ]1 N9 `' O9 X8 ?% {* l} 2 ~. b8 N, }4 N% D$ \8 E/ K
: I# x3 j6 B& q9 N
; c/ ~4 ?8 c) @3 V- L
void B_Creat(struct B* p)
! G8 h! q7 h4 e6 |{
" i7 ]7 D8 f$ c# e& d6 N( zp->Foo=B_Foo;
1 f/ Z* q' P- d# c& Fp->a=11;
9 ?% e$ p) ~5 P/ \p->b=12;
3 g2 f [' I# t5 `; P5 u& tp->c=13;
. M; ~# K8 W. T* q9 f0 \# F' q/ pp->B_this=p;
! {7 ?! l( K2 R1 @; B3 H D6 h1 e: [}
. u2 e& U+ O) } _6 X& @3 G: H' a. I1 p) U+ T+ t9 C
- I: c5 y% ], B% y9 Aint main(int argc, char* argv[])
* @0 o, H" i( \# |, }1 `2 d{
2 y; N+ W0 @: g7 G" \) _. gC_Class A *ma,a;
" d1 e* q. \, L' k3 P" K& mC_Class B *mb,b;
9 |" y- J; \3 ?
8 A, d8 \2 @0 A z# qA_Creat(&a);//实例化
& q7 V+ a8 n7 B9 VB_Creat(&b);
9 l/ V o6 [7 t/ Y1 a" ?3 p9 v" a7 b2 j# s; {
mb=&b;
. Y& l( S1 F4 H6 }: Xma=&a;
: ?$ y0 O0 e8 V4 F) \0 y0 m. `, G W+ j& S3 f1 i' n Z/ @
ma=(C_Class A*)mb;//引入多态指针 & N; {$ z1 J' |0 ]
printf("%d ",ma->a);//可惜的就是 函数变量没有private
' o2 R6 k6 q! r4 t* y* Wma->Foo(ma);//多态
- n$ T8 d7 k0 ua.Foo(&a);//不是多态了 & O4 e9 [+ x" k- ?$ p/ Z
B_F2(&b);//成员函数,因为效率问题不使用函数指针
" G, H7 q" y1 o, creturn 0;
$ c2 [! Y; m) U% |} ' p B7 a0 B1 k
输出结果:
' [) q5 {, x7 q/ l: i- I1 x11
, d7 X; u/ a/ S8 uIt is B.c=13 0 ?) c# P6 u2 G& Y' o3 d
It is A.a=1 3 c) G# h( { m! j; a6 m" j/ A$ a8 `- O
It is B_Fun |