Основы языка программирования C++ с применением объектно-ориентированного программирования. Чернышов М.К. - 50 стр.

UptoLike

Составители: 

ɜɵɩɨɥɧɟɧɢɹ ɩɪɨɝɪɚɦɦɵ ɬɪɟɛɭɟɬɫɹ ɩɪɨɜɟɪɹɬɶ, ɧɚ ɨɛɴɟɤɬ ɤɚɤɨɝɨ ɬɢɩɚ ɫɫɵɥɚ-
ɟɬɫɹ ɭɤɚɡɚɬɟɥɶ, ɢ ɩɨɫɥɟ ɬɚɤɨɣ ɩɪɨɜɟɪɤɢ ɜɵɡɵɜɚɬɶ ɬɪɟɛɭɟɦɭɸ ɮɭɧɤɰɢɸ. ɗɬɢ
ɞɟɣɫɬɜɢɹ ɧɚɡɵɜɚɸɬ «ɩɨɡɞɧɢɦ» ɫɜɹɡɵɜɚɧɢɟɦ, ɜ ɨɬɥɢɱɢɟ ɨɬ «ɪɚɧɧɟɝɨ» ɫɜɹ-
ɡɵɜɚɧɢɹ, ɩɪɢ ɤɨɬɨɪɨɦ ɭɠɟ ɧɚ ɷɬɚɩɚɯ ɤɨɦɩɢɥɹɰɢɢ ɢɥɢ ɪɟɞɚɤɬɢɪɨɜɚɧɢɹ ɫɜɹ-
ɡɟɣ ɦɨɠɧɨ ɭɫɬɚɧɨɜɢɬɶ ɚɞɪɟɫ ɬɨɱɤɢ ɜɯɨɞɚ ɜɵɡɵɜɚɟɦɨɣ ɮɭɧɤɰɢɢ. ȼ ɨɛɴɟɤɬ-
ɧɨ-ɨɪɢɟɧɬɢɪɨɜɚɧɧɵɯ ɹɡɵɤɚɯ ɩɪɨɝɪɚɦɦɢɪɨɜɚɧɢɹ ɞɥɹ ɪɟɲɟɧɢɹ ɷɬɨɣ ɩɪɨɛɥɟ-
ɦɵ ɩɪɢɦɟɧɹɸɬɫɹ ɜɢɪɬɭɚɥɶɧɵɟ ɦɟɬɨɞɵ.
4.5.2. Ɉɩɢɫɚɧɢɟ ɜɢɪɬɭɚɥɶɧɵɯ ɮɭɧɤɰɢɣ
Ɏɭɧɤɰɢɹ-ɤɨɦɩɨɧɟɧɬɚ ɤɥɚɫɫɚ ɨɛɴɹɜɥɹɟɬɫɹ ɤɚɤ ɜɢɪɬɭɚɥɶɧɚɹ ɭɤɚɡɚɧɢɟɦ
ɤɥɸɱɟɜɨɝɨ ɫɥɨɜɚ
virtual. Ɏɭɧɤɰɢɢ-ɤɨɦɩɨɧɟɧɬɵ ɜ ɩɪɨɢɡɜɨɞɧɵɯ ɤɥɚɫɫɚɯ,
ɡɚɦɟɧɹɸɳɢɟ ɜɢɪɬɭɚɥɶɧɭɸ ɮɭɧɤɰɢɸ ɛɚɡɨɜɨɝɨ ɤɥɚɫɫɚ, ɞɨɥɠɧɵ ɨɛɴɹɜɥɹɬɶɫɹ
ɫ ɬɟɦ ɠɟ ɢɦɟɧɟɦ, ɬɟɦ ɠɟ ɫɩɢɫɤɨɦ ɩɚɪɚɦɟɬɪɨɜ ɢ ɬɢɩɨɦ ɜɨɡɜɪɚɳɚɟɦɨɝɨ ɡɧɚ-
ɱɟɧɢɹ, ɱɬɨ ɢ ɫɨɨɬɜɟɬɫɬɜɭɸɳɚɹ ɮɭɧɤɰɢɹ ɛɚɡɨɜɨɝɨ ɤɥɚɫɫɚ. ȿɫɥɢ ɢɡ ɩɪɨɢɡ-
ɜɨɞɧɨɝɨ ɤɥɚɫɫɚ ɧɟ ɨɛɪɚɡɭɟɬɫɹ ɧɨɜɵɯ ɩɪɨɢɡɜɨɞɧɵɯ ɤɥɚɫɫɨɜ, ɤɥɸɱɟɜɨɟ ɫɥɨɜɨ
virtual ɜ ɨɩɢɫɚɧɢɢ ɮɭɧɤɰɢɢ ɦɨɠɧɨ ɨɩɭɫɬɢɬɶ.
ȿɫɥɢ ɜ ɩɪɨɢɡɜɨɞɧɨɦ ɤɥɚɫɫɟ ɧɟɬ ɨɛɴɹɜɥɟɧɢɹ ɮɭɧɤɰɢɢ ɫ ɬɟɦ ɠɟ ɢɦɟɧɟɦ,
ɱɬɨ ɢ ɜɢɪɬɭɚɥɶɧɚɹ ɮɭɧɤɰɢɹ ɛɚɡɨɜɨɝɨ ɤɥɚɫɫɚ, ɛɭɞɟɬ ɜɵɡɵɜɚɬɶɫɹ ɮɭɧɤɰɢɹ ɛɚ-
ɡɨɜɨɝɨ ɤɥɚɫɫɚ.
ȼɢɪɬɭɚɥɶɧɚɹ ɮɭɧɤɰɢɹ ɦɨɠɟɬ ɛɵɬɶ ɨɛɴɹɜɥɟɧɚ ɜ ɮɨɪɦɟ:
virtual void print()=0;
Ɍɚɤɚɹ ɮɭɧɤɰɢɹ ɧɚɡɵɜɚɟɬɫɹ «ɱɢɫɬɨɣ» (pure) ɜɢɪɬɭɚɥɶɧɨɣ ɮɭɧɤɰɢɟɣ, ɚɨɛɴ-
ɟɤɬɧɵɣ ɬɢɩ, ɫɨɞɟɪɠɚɳɢɣ ɟɟ ɨɛɴɹɜɥɟɧɢɟ, ɧɚɡɵɜɚɟɬɫɹ ɚɛɫɬɪɚɤɬɧɵɦ ɨɛɴɟɤɬ-
ɧɵɦ ɬɢɩɨɦ. ȼ ɩɪɨɝɪɚɦɦɟ ɧɟ ɦɨɝɭɬ ɫɨɡɞɚɜɚɬɶɫɹ ɷɤɡɟɦɩɥɹɪɵ ɚɛɫɬɪɚɤɬɧɵɯ
ɬɢɩɨɜ, ɬɚɤɨɣ ɬɢɩ ɦɨɠɟɬ ɢɫɩɨɥɶɡɨɜɚɬɶɫɹ ɬɨɥɶɤɨ ɞɥɹ ɨɛɪɚɡɨɜɚɧɢɹ ɩɪɨɢɡɜɨɞ-
ɧɵɯ ɬɢɩɨɜ, ɩɪɢɱɟɦ ɜ ɩɪɨɢɡɜɨɞɧɨɦ ɬɢɩɟ ɫɥɟɞɭɟɬ ɥɢɛɨ ɫɧɨɜɚ ɨɩɪɟɞɟɥɢɬɶ ɷɬɭ
ɜɢɪɬɭɚɥɶɧɭɸ ɮɭɧɤɰɢɸ ɤɚɤ ɱɢɫɬɭɸ, ɥɢɛɨ ɨɛɴɹɜɢɬɶ ɟɟ ɤɚɤ ɨɛɵɱɧɭɸ ɜɢɪɬɭ-
ɚɥɶɧɭɸ ɮɭɧɤɰɢɸ, ɜɵɩɨɥɧɹɸɳɭɸ ɤɨɧɤɪɟɬɧɵɟ ɞɟɣɫɬɜɢɹ.
ȼɢɪɬɭɚɥɶɧɵɟ ɮɭɧɤɰɢɢ ɨɫɨɛɟɧɧɨ ɩɨɥɟɡɧɵ, ɤɨɝɞɚ ɤ ɦɟɬɨɞɨɦ ɤɥɚɫɫɚ ɬɪɟ-
ɛɭɟɬɫɹ ɨɛɪɚɳɚɬɶɫɹ ɱɟɪɟɡ ɭɤɚɡɚɬɟɥɶ ɧɚ ɷɤɡɟɦɩɥɹɪ ɤɥɚɫɫɚ, ɚ ɫɚɦ ɷɬɨɬ ɭɤɚɡɚ-
ɬɟɥɶ ɢɦɟɟɬ ɬɢɩ ɭɤɚɡɚɬɟɥɹ ɧɚ ɛɚɡɨɜɵɣ ɤɥɚɫɫ. ɉɭɫɬɶ, ɧɚɩɪɢɦɟɪ, ɜ ɤɥɚɫɫɟ
TBase ɨɛɴɹɜɥɟɧɚ ɱɢɫɬɚɹ ɜɢɪɬɭɚɥɶɧɚɹ ɮɭɧɤɰɢɹ print:
class TBase // ɛɚɡɨɜɵɣ ɤɥɚɫɫ ɞɥɹ ɦɚɫɫɢɜɨɜ ɜɫɟɯ ɬɢɩɨɜ
{
int size, //ɪɚɡɦɟɪ ɷɥɟɦɟɧɬɚ
count, //ɬɟɤɭɳɟɟ ɱɢɫɥɨ ɷɥɟɦɟɧɬɨɜ
maxCount, //ɪɚɡɦɟɪ ɜɵɞɟɥɟɧɧɨɣ ɩɚɦɹɬɢ ɜ ɛɚɣɬɚɯ
delta; //ɩɪɢɪɚɳɟɧɢɟ ɩɚɦɹɬɢ ɜ ɛɚɣɬɚɯ
char *pmem; //ɭɤɚɡɚɬɟɥɶ ɧɚ ɜɵɞɟɥɟɧɧɭɸ ɩɚɦɹɬɶ
int changeSize(); //ɩɟɪɟɪɚɫɩɪɟɞɟɥɟɧɢɟ ɩɚɦɹɬɢ
protected:
void* getAddr(){return (void*)pmem;};
void addNewItem(void*); //ɞɨɛɚɜɥɟɧɢɟ ɜ ɤɨɧɟɰ ɦɚɫɫɢɜɚ
void error(const char* msg){cout<<msg<<endl;};
50
ɜɵɩɨɥɧɟɧɢɹ ɩɪɨɝɪɚɦɦɵ ɬɪɟɛɭɟɬɫɹ ɩɪɨɜɟɪɹɬɶ, ɧɚ ɨɛɴɟɤɬ ɤɚɤɨɝɨ ɬɢɩɚ ɫɫɵɥɚ-
ɟɬɫɹ ɭɤɚɡɚɬɟɥɶ, ɢ ɩɨɫɥɟ ɬɚɤɨɣ ɩɪɨɜɟɪɤɢ ɜɵɡɵɜɚɬɶ ɬɪɟɛɭɟɦɭɸ ɮɭɧɤɰɢɸ. ɗɬɢ
ɞɟɣɫɬɜɢɹ ɧɚɡɵɜɚɸɬ «ɩɨɡɞɧɢɦ» ɫɜɹɡɵɜɚɧɢɟɦ, ɜ ɨɬɥɢɱɢɟ ɨɬ «ɪɚɧɧɟɝɨ» ɫɜɹ-
ɡɵɜɚɧɢɹ, ɩɪɢ ɤɨɬɨɪɨɦ ɭɠɟ ɧɚ ɷɬɚɩɚɯ ɤɨɦɩɢɥɹɰɢɢ ɢɥɢ ɪɟɞɚɤɬɢɪɨɜɚɧɢɹ ɫɜɹ-
ɡɟɣ ɦɨɠɧɨ ɭɫɬɚɧɨɜɢɬɶ ɚɞɪɟɫ ɬɨɱɤɢ ɜɯɨɞɚ ɜɵɡɵɜɚɟɦɨɣ ɮɭɧɤɰɢɢ. ȼ ɨɛɴɟɤɬ-
ɧɨ-ɨɪɢɟɧɬɢɪɨɜɚɧɧɵɯ ɹɡɵɤɚɯ ɩɪɨɝɪɚɦɦɢɪɨɜɚɧɢɹ ɞɥɹ ɪɟɲɟɧɢɹ ɷɬɨɣ ɩɪɨɛɥɟ-
ɦɵ ɩɪɢɦɟɧɹɸɬɫɹ ɜɢɪɬɭɚɥɶɧɵɟ ɦɟɬɨɞɵ.
4.5.2. Ɉɩɢɫɚɧɢɟ ɜɢɪɬɭɚɥɶɧɵɯ ɮɭɧɤɰɢɣ

    Ɏɭɧɤɰɢɹ-ɤɨɦɩɨɧɟɧɬɚ ɤɥɚɫɫɚ ɨɛɴɹɜɥɹɟɬɫɹ ɤɚɤ ɜɢɪɬɭɚɥɶɧɚɹ ɭɤɚɡɚɧɢɟɦ
ɤɥɸɱɟɜɨɝɨ ɫɥɨɜɚ virtual. Ɏɭɧɤɰɢɢ-ɤɨɦɩɨɧɟɧɬɵ ɜ ɩɪɨɢɡɜɨɞɧɵɯ ɤɥɚɫɫɚɯ,
ɡɚɦɟɧɹɸɳɢɟ ɜɢɪɬɭɚɥɶɧɭɸ ɮɭɧɤɰɢɸ ɛɚɡɨɜɨɝɨ ɤɥɚɫɫɚ, ɞɨɥɠɧɵ ɨɛɴɹɜɥɹɬɶɫɹ
ɫ ɬɟɦ ɠɟ ɢɦɟɧɟɦ, ɬɟɦ ɠɟ ɫɩɢɫɤɨɦ ɩɚɪɚɦɟɬɪɨɜ ɢ ɬɢɩɨɦ ɜɨɡɜɪɚɳɚɟɦɨɝɨ ɡɧɚ-
ɱɟɧɢɹ, ɱɬɨ ɢ ɫɨɨɬɜɟɬɫɬɜɭɸɳɚɹ ɮɭɧɤɰɢɹ ɛɚɡɨɜɨɝɨ ɤɥɚɫɫɚ. ȿɫɥɢ ɢɡ ɩɪɨɢɡ-
ɜɨɞɧɨɝɨ ɤɥɚɫɫɚ ɧɟ ɨɛɪɚɡɭɟɬɫɹ ɧɨɜɵɯ ɩɪɨɢɡɜɨɞɧɵɯ ɤɥɚɫɫɨɜ, ɤɥɸɱɟɜɨɟ ɫɥɨɜɨ
virtual ɜ ɨɩɢɫɚɧɢɢ ɮɭɧɤɰɢɢ ɦɨɠɧɨ ɨɩɭɫɬɢɬɶ.
    ȿɫɥɢ ɜ ɩɪɨɢɡɜɨɞɧɨɦ ɤɥɚɫɫɟ ɧɟɬ ɨɛɴɹɜɥɟɧɢɹ ɮɭɧɤɰɢɢ ɫ ɬɟɦ ɠɟ ɢɦɟɧɟɦ,
ɱɬɨ ɢ ɜɢɪɬɭɚɥɶɧɚɹ ɮɭɧɤɰɢɹ ɛɚɡɨɜɨɝɨ ɤɥɚɫɫɚ, ɛɭɞɟɬ ɜɵɡɵɜɚɬɶɫɹ ɮɭɧɤɰɢɹ ɛɚ-
ɡɨɜɨɝɨ ɤɥɚɫɫɚ.
    ȼɢɪɬɭɚɥɶɧɚɹ ɮɭɧɤɰɢɹ ɦɨɠɟɬ ɛɵɬɶ ɨɛɴɹɜɥɟɧɚ ɜ ɮɨɪɦɟ:
     virtual void print()=0;
Ɍɚɤɚɹ ɮɭɧɤɰɢɹ ɧɚɡɵɜɚɟɬɫɹ «ɱɢɫɬɨɣ» (pure) ɜɢɪɬɭɚɥɶɧɨɣ ɮɭɧɤɰɢɟɣ, ɚ ɨɛɴ-
ɟɤɬɧɵɣ ɬɢɩ, ɫɨɞɟɪɠɚɳɢɣ ɟɟ ɨɛɴɹɜɥɟɧɢɟ, ɧɚɡɵɜɚɟɬɫɹ ɚɛɫɬɪɚɤɬɧɵɦ ɨɛɴɟɤɬ-
ɧɵɦ ɬɢɩɨɦ. ȼ ɩɪɨɝɪɚɦɦɟ ɧɟ ɦɨɝɭɬ ɫɨɡɞɚɜɚɬɶɫɹ ɷɤɡɟɦɩɥɹɪɵ ɚɛɫɬɪɚɤɬɧɵɯ
ɬɢɩɨɜ, ɬɚɤɨɣ ɬɢɩ ɦɨɠɟɬ ɢɫɩɨɥɶɡɨɜɚɬɶɫɹ ɬɨɥɶɤɨ ɞɥɹ ɨɛɪɚɡɨɜɚɧɢɹ ɩɪɨɢɡɜɨɞ-
ɧɵɯ ɬɢɩɨɜ, ɩɪɢɱɟɦ ɜ ɩɪɨɢɡɜɨɞɧɨɦ ɬɢɩɟ ɫɥɟɞɭɟɬ ɥɢɛɨ ɫɧɨɜɚ ɨɩɪɟɞɟɥɢɬɶ ɷɬɭ
ɜɢɪɬɭɚɥɶɧɭɸ ɮɭɧɤɰɢɸ ɤɚɤ ɱɢɫɬɭɸ, ɥɢɛɨ ɨɛɴɹɜɢɬɶ ɟɟ ɤɚɤ ɨɛɵɱɧɭɸ ɜɢɪɬɭ-
ɚɥɶɧɭɸ ɮɭɧɤɰɢɸ, ɜɵɩɨɥɧɹɸɳɭɸ ɤɨɧɤɪɟɬɧɵɟ ɞɟɣɫɬɜɢɹ.
    ȼɢɪɬɭɚɥɶɧɵɟ ɮɭɧɤɰɢɢ ɨɫɨɛɟɧɧɨ ɩɨɥɟɡɧɵ, ɤɨɝɞɚ ɤ ɦɟɬɨɞɨɦ ɤɥɚɫɫɚ ɬɪɟ-
ɛɭɟɬɫɹ ɨɛɪɚɳɚɬɶɫɹ ɱɟɪɟɡ ɭɤɚɡɚɬɟɥɶ ɧɚ ɷɤɡɟɦɩɥɹɪ ɤɥɚɫɫɚ, ɚ ɫɚɦ ɷɬɨɬ ɭɤɚɡɚ-
ɬɟɥɶ ɢɦɟɟɬ ɬɢɩ ɭɤɚɡɚɬɟɥɹ ɧɚ ɛɚɡɨɜɵɣ ɤɥɚɫɫ. ɉɭɫɬɶ, ɧɚɩɪɢɦɟɪ, ɜ ɤɥɚɫɫɟ
TBase ɨɛɴɹɜɥɟɧɚ ɱɢɫɬɚɹ ɜɢɪɬɭɚɥɶɧɚɹ ɮɭɧɤɰɢɹ print:
     class TBase       // ɛɚɡɨɜɵɣ ɤɥɚɫɫ ɞɥɹ ɦɚɫɫɢɜɨɜ ɜɫɟɯ ɬɢɩɨɜ
        {
        int size,                             //ɪɚɡɦɟɪ ɷɥɟɦɟɧɬɚ
        count,                        //ɬɟɤɭɳɟɟ ɱɢɫɥɨ ɷɥɟɦɟɧɬɨɜ
        maxCount,           //ɪɚɡɦɟɪ ɜɵɞɟɥɟɧɧɨɣ ɩɚɦɹɬɢ ɜ ɛɚɣɬɚɯ
        delta;                     //ɩɪɢɪɚɳɟɧɢɟ ɩɚɦɹɬɢ ɜ ɛɚɣɬɚɯ
        char *pmem;            //ɭɤɚɡɚɬɟɥɶ ɧɚ ɜɵɞɟɥɟɧɧɭɸ ɩɚɦɹɬɶ
        int changeSize();            //ɩɟɪɟɪɚɫɩɪɟɞɟɥɟɧɢɟ ɩɚɦɹɬɢ
        protected:
         void* getAddr(){return (void*)pmem;};
         void addNewItem(void*);   //ɞɨɛɚɜɥɟɧɢɟ ɜ ɤɨɧɟɰ ɦɚɫɫɢɜɚ
         void error(const char* msg){cout<