1
7 7.1 7.2 7.3 7.4 7.5 2
7.1 VFT virtual 7.1 3
1 1. 2. public protected public 3. VFT 4. this const volatile 4
2 5. ( ) ( ) 7.1 6. no-static virtual 7.2 7. inline 7.3 5
3 8. this this 9. ( ) ( ) delete *f 6
4 10. ( ) virtual friend 11. 12. union union 7.2 7
7.1 POINT CIRCLE show #include <iostream.h> class POINT{ int x, y; public: int getx( ) { return x; } int gety( ) { return y; } virtual void show( ) { cout<<"show a point\n"; } POINT(int x, int y) { POINT::x=x; POINT::y=y; } class CIRCLE: public POINT{ int r; public: int getr( ) { return r; } void show( ) { cout<<"show a circle\n"; } CIRCLE(int x, int y, int r):point(x, y) { CIRCLE::r=r; } Return 8
void main(void) { CIRCLE c(3, 7, 8); POINT *p=&c; // p Circle cout<<"the circle with radius "<<c.getr( ); cout<<" is at ("<<p->getx( )<<", "<<p->gety( )<<")\n"; p->show( ); } The circle with radius 8 is at (3, 7) Show a circle virtual //p->show( ) Return 2 9
7.2 #include <iostream.h> struct A{ virtual void f1( ){ cout<<"a::f1\n"; } virtual void f2( ){ cout<<"a::f2\n"; } virtual void f3( ){ cout<<"a::f3\n"; } virtual void f4( ){ cout<<"a::f4\n"; } class B: A{ virtual void f1( ) //virtual { cout<<"b::f1\n"; } void f2( ) //f2 { cout<<"b::f2\n"; } class C: B{ void f4( ) //f4 { cout<<"c::f4\n"; } Return 2 void main(void) { C c; A *p=(a *)&c; p->f1( ); p->f2( ); p->f3( ); p->f4( ); p->a::f2( ); } B::f1 B::f2 A::f3 C::f4 A::f2 // B::f1( ) // B::f2( ) // A::f3( ) // C::f4( ) // A::f2( ) ( ) c.f1( ); //? c.f2( ); //? 10
7.3 #include <iostream.h> struct A{ virtual void f1( ) { cout<<"a0"; } virtual void f1(char c) { cout<<"a1"; } void f1(int x) { cout<<"a2"; } class B: A{ void f1( ) { cout<<"b0"; } void f1(int x) { cout<<"b2"; } class C: B{ void f1( ) { cout<<"c0"; } void f1(char c) { cout<<"c1"; } public: void f1(long x) { cout<<"c3"; } } // // // void main(void) { C c; A *p=(a *)&c; p->f1('x'); p->f1( ); c.f1(23l); p->f1(3) // // // C::f1(char) // C::f1( ) // C::f1(long) // A::f1(int) C1C0C3A2 1. c.f1(3); // 2. A::f1(int) p->f1(3) // 11
1. 2. A f( ) B f( ) B::f( ) A::f( ) f( ) Return 2 12
7.2 7.4 delete 13
7.4,,, #include <stdio.h> #include <string.h> class STRING{ char *str; public: STRING(char *s); virtual ~STRING( ) { if (str) { delete str; str=0; } } STRING::STRING(char *s) { str=new char[strlen(s)+1]; strcpy(str, s); } 14
class CLERK: public STRING{ STRING clkid; int age; public: CLERK(char *n, char *i, int a); ~CLERK( ){ } // clkid.~string( ) STRING::~STRING( ) CLERK::CLERK(char *n, char *i, int a):string(n), clkid(i) { age=a; } 15
const int max=10; void main(void) { STRING *s[max]; int a, k, m; char n[12], i[12], t[256]; printf("please input name, number and age:\n"); for(k=0; k<max; k++) { gets(t); m=sscanf(t, %8s %8s %d,n,i,&a)!=3; //m s[k]=m?new STRING(n):new CLERK(n,i,a); } for(k=0; k<max; k++) delete s[k]; // s[k] STRING s[k]->~string( ) } // s[k] CLERK s[k]->~clerk( ) Return 7.2 STRING 16
new delete & STRING &z=*new CLERK("zang","982021",23); delete &z; // z z delete &z CLERK zang 982021 23 str CLERK "zang" "982021" 23. delete &z z.~clerk( ) free(&z) delete &z 17
7.3 ( Java interface) virtual =0; =0 this. ( Java interface) 7.5 18
7.5 #include <iostream.h> struct A{ //A virtual void f1( )=0; virtual void f2( )=0; void A::f1( ){ cout<<"a1"; } } void A::f2( ){ cout<<"a2"; } class B: public A{ void f2( ) { this->a::f2( ); cout<<"b2"; } class C: public B{ void f1( ) { cout<<"c1"; } void main(void) { C c; A *p=(a *)&c; p->f1( ); p->f2( ); // f2 f1 B // f1 f2 C // C::f1( ) // B::f2( ) C1A2B2 19
1 new, 7.6 20
7.6 #include <iostream.h> struct A{ // A virtual void f1( )=0; void f2( ) { struct B: A{ // A void f1( ){ A f( ); int g(a x); A &h(a &y); // B void main(void) { } A a; A *p; p->f1( ); p->f2( ); // A // A // a // B // A::f1( ) // A::f2( ) 21
2 malloc malloc < 7.7 > 22
7.4 A f B f B f B C f C A C 23
7.8 #include <iostream.h> class C; struct A { virtual void f1(c &c)=0; virtual void f2(c &c); class B: A{ public: void f1(c &c); //f1 class C { char c; // A::f1(C &c) friend void A::f1(C &c); friend void A::f2(C &c); public: C(char c) { C::c=c; } void A::f1(C &c) { cout<<"b outputs "<<c.c<<"\n"; } void A::f2(C &c) { cout<<"a outputs "<<c.c<<"\n"; } void B::f1(C &c) { cout<<c.c; } void main( void) { B b; C c('c'); } // B::f1 C c.c A *p=(a *) new B; p->f1(c); // B::f1( ) p->f2(c); // A::f2( ) 24
7.5 (VFT ) VFT VFT 7.10 7.11 25
7.10 #include <iostream.h> class A{ static int b; int a; B B virtual int f( ); virtual int g( ); virtual int h( ); B::f A::f int a A::g A::g class B: A{ A A::h A::h static int y; B::u int x; int x B::v B int f( ); virtual int u( ); B virtual int v( ); void main(void) sizeof(a) sizeof(a) sizeof(void *) { sizeof(b) sizeof(a) sizeof(x) cout<<"size of int="<<sizeof(int)<<"\n"; cout<<"size of pointer="<<sizeof(void *)<<"\n"; cout<<"size of A="<<sizeof(A)<<"\n"; cout<<"size of B="<<sizeof(B)<<"\n"; } return 26
7.11 #include <iostream.h> class A{ static int b; int a; class B: A{ static int y; int x; public: virtual void u( ) { virtual void v( ) { void main(void) { int a int x cout<<"size of int="<<sizeof(int)<<"\n"; cout<<"size of pointer="<<sizeof(void *)<<"\n"; cout<<"size of A="<<sizeof(A)<<"\n"; cout<<"size of B="<<sizeof(B)<<"\n"; } sizeof(a) sizeof(a) sizeof(b) sizeof(a) sizeof(void *) sizeof(x) A B B::u B::v 27