, , - . , - , .
, , (, ..) . , , .
, , , - . - .
, , .
, ( , ) . :
// BASE.DIR - class base { public: void fun (int i) { printf("\nbase::i =",i); }};class dir: public base{ public: void fun (int i) { printf("\nbase::i =",i); }};void fun(int) base dir.
dir fun(), base, , : base::fun(). dir ( ) , dir, fun() .
, base dir, fun () :
// #include <stdio.h>#include base.dir // void main (void){ base B, *bp = &B; dir D, *dp = &D; base *pbd = &D; bp->fun (1); // : base::i = 1 dp->fun (5); // : dir::i = 5 pbd->fun (4); // : base::i = 4}. pbd. ( D) (base*). , ++. , .. , ( ). base dir bp dp . pbd->fun() . pbd base*, - D dir.
|
|
base::fun() dir::fun() pbd->fun()? , . ++, .. ( ) , . , .
void show(). show() :
__::show(),
:
___.show().
. .
( ) (), , . , virtual. , . , , virtual.
00 // 01 #include <stdio.h>02 class base 03 { public:04 virtual void vfun(int i) { printf("\nbase::i =",i); }05 };06 class dir1: public base 07 { public:08 void vfun(int i) { printf("\ndir1::i =",i); }09 };10 class dir2: public base 11 { public:12 void vfun(int i) { printf("\ndir2::i =",i); }13 };14 void main (void)15 {16 base B, *bp = &B;17 dir1 D1, *dp1 = &D1;18 dir2 D2, *dp2 = &D2;19 bp->vfun(1); // : base::i = 120 dp1->vfun(2); // : dir1::i = 221 dp2->vfun(3); // : dir2::i = 322 bp =&D1; bp->vfun(4); // : dir1::i = 423 bp =&D2; bp->vfun(5); // : dir2::i = 524 }, vfun() bp . , . &D1, &D2, . , , , . .
, - . , ( ) , virtual .
|
|
, , . .
, , , . ( virtual ). :
00 // 01 #include <stdio.h>02 class base 03 { public:04 virtual void f1(void){ printf("\nbase::f1"); }05 virtual void f2(void){ printf("\nbase::f2"); }06 virtual void f3(void){ printf("\nbase::f3"); }07 };08 class dir: public base 09 { public: 10 void f1(void){ printf("\ndir::f1"); } // 11 //int f2(void){ printf("\ndir::f2"); } // 12 void f3(int i){printf("\ndir::f3:%d",i);} //13 };14 void main (void)15 {16 base B, *bp = &B; dir D, *dp = &D;17 bp->f1(); // : base::f118 bp->f2(); // : base::f219 bp->f3(); // : base::f320 dp->f1(); // : dir::f121 dp->f2(); // : base::f222 //dp->f3(); // - 23 dp->f3(3); // : dir::f3::324 bp = &D;25 bp->f1(); // : dir::f126 bp->f2(); // : base::f227 bp->f3(); // : base::f328 //bp->f3(3); // - 29 }, . . , , virtual, . , .. . (friend) .
. , ( ) . :
class base{ public: virtual int f (int j) { return j * j; }};class dir: public base { public: int f (int i){ return base::f (i * 2); } };
, () . , :
virtual _(__) = 0;
= 0 . :
virtual void fpure(void) = 0;
. - . . . . :
class B { protected: virtual void f(int) = 0; void s(int);};class D: public B {... void f(int); };class E: public B {... void s(int); };B - , D - , f - , s - , E - , s - , f - .
, . , .
|
|
. . . . , . , .
*(type*)&x, . .
dynamic_cast<T*>(argptr) // RTTIstatic_cast<T>(arg) //