12
.
C++ . -, . , , .
-, . , (, , ) , . .
, ( ) , . , . .
C++ , , . , . , , . , . , , .
. . . , Visual C++ 6.0 vfptr, vftable ( Virtual Function Table). , . , , , , . .
, . , . , ( ), .
|
|
, .
, . , , .
, ( ), , , (, , ).
, , , .
, , , . , . :
class Coord //
{
protected: //
double x, y; //
public: //
Coord () { x = 0; y = 0; } //
void Input (); //
virtual void Print (); //
};
void Coord:: Input () //
{
cout<<"\tx="; cin>>x; // x
cout<<"\ty="; cin>>y; // y
}
void Coord:: Print () //
{
cout<<"\tx="<<x<<"\ty="<<y<<'\n';
}
class Dot: public Coord //
{
char name; //
public: //
Dot (char N): Coord () { name = N; } //
void Input (); //
void Print (); //
};
void Dot:: Input () //
{
char S [ ] =" "; //
CharToOem (S, S); //
cout<<S<<name<<'\n'; //
Coord:: Input (); //
}
void Dot:: Print() //
{
char S [ ] =" "; //
CharToOem (S, S); //
cout<<S<<name<<":"; //
Coord:: Print (); //
}
class Vec: public Coord //
{
char name [ 3 ]; //
public: //
|
|
Vec (char* pName): Coord () { strncpy (name, pName, 3); name [ 2 ] = '\0'; }
void Input (); //
void Print (); //
};
void Vec:: Input() //
{
char S [ ] =" "; //
CharToOem (S, S); //
cout<<S<<name<<'\n'; //
Coord:: Input (); //
}
void Vec:: Print () //
{
char S [ ] = " "; //
CharToOem (S, S); //
cout<<S<<name<<":"; //
Coord:: Print (); //
}
Coord Dot Vec. Print () , Coord. Print () Dot Vec . Print (), .
Input () Coord Dot Vec.
Void main ()
{
Coord* pC = new Coord (); //
Dot* pD = new Dot ('D'); //
Vec* pV = new Vec ("V"); //
pC->Input (); // Coord:: Input ()
pC->Print (); // Coord:: Print ()
pC = pD; //
pC->Input (); // Coord:: Input ()
pC->Print (); // Dot:: Print ()
pC = pV; //
pC->Input (); // Coord:: Input ()
pC->Print (); // Vec:: Print ()
}
pC , . , pC , .
, , .
, pC = pD, (Coord* Dot*) , . pD = pC .
:
x = 1
y = 1
x = 1 y = 1
x = 2
y = 2
D: x = 2 y = 2
x = 3
y = 3
V: x = 3 y = 3
, :
1... , ;
2... .
, . . virtual , : .
, , , . , , , , . , . , .
|
|
, , . .
, , . . . .
. , ( ).
, . :
class Coord //
{
protected: //
double x, y; //
public: //
Coord () { x = 0; y = 0; } //
virtual ~Coord () { cout<<"Delete x, y\n"; } //
};
class Dot: public Coord //
{
char name; //
public: //
Dot (char N): Coord () { name = N; } //
~Dot () { cout<<"Delete name \n"; } //
};
Void main ()
{
Coord* pC; //
pC = new Dot ('D'); //
delete pC; //
}
Dot ,
delete pC;
Dot:: ~Dot () . :
Delete name
Delete x, y
, . , Coord:: ~Coord (), , Coord. :
Delete x, y
:
1... , ;
2... , , ;
3... .
, , . "", . .
|
|
, , , . , , , . :
virtual <_>(< >) = 0;
. , , - Coord , Coord , . Coord :
class Coord //
{
protected: //
double x, y; //
public: //
Coord () { x = 0; y = 0; } //
virtual void Print () = 0; //
};
class Dot: public Coord //
{
char name; //
public: //
Dot (char N): Coord () { name = N; } //
// void Print (); //
// Print ()
};
Void main ()
{
Coord C; // :
Dot D; // :
}
Print () Coord , , Coord, Print ().
. :
1... , ;
2... ;
3... ;
4... .
, , , .
, . :
<__>:: <__>(<_>)
:
;
, ;
;
;
.