Ћекции.ќрг


ѕоиск:




 атегории:

јстрономи€
Ѕиологи€
√еографи€
ƒругие €зыки
»нтернет
»нформатика
»стори€
 ультура
Ћитература
Ћогика
ћатематика
ћедицина
ћеханика
ќхрана труда
ѕедагогика
ѕолитика
ѕраво
ѕсихологи€
–елиги€
–иторика
—оциологи€
—порт
—троительство
“ехнологи€
“ранспорт
‘изика
‘илософи€
‘инансы
’ими€
Ёкологи€
Ёкономика
Ёлектроника

 

 

 

 


 онструкторы, деструкторы и наследование




 онструкторы не наследуютс€. ≈сли конструктор базового класса требует спецификации одного или нескольких параметров, конструктор производного класса должен вызывать базовый конструктор, использу€ список инициализации элементов.

ƒеструктору производного класса, напротив, не требуетс€ €вно вызывать деструктор базового класса. ¬ деструкторе производного класса компил€тор автоматически генерирует вызовы базовых деструкторов.

 

¬иртуальные функции

 

„лен-функци€ базового класса может быть переопределена в производных классах и вызыватьс€ с помощью указател€ или ссылки на базовый класс, которые ссылаютс€ на объект производного класса. »ными словами, в базовом и производном классах могут быть функции с одинаковыми именами и даже с одинаковыми списками параметров. ¬ызыватьс€ будет член-функци€ того класса, которому принадлежит объект, чей адрес находитс€ в указателе на базовый класс или на который ссылаетс€ ссылка на базовый класс. —ледует еще раз подчеркнуть, что, например, имеетс€ указатель на базовый класс, а адрес в него может быть занесен объекта производного класса. » тогда с помощью данного указател€ будет вызвана член-функци€ именно этого производного класса из нескольких функций с одинаковыми именами.

ƒл€ того чтобы функцию с каким-то именем объ€вить виртуальной, нужно в базовом классе описать ее в иде:

Virtual тип_результата им€-функции(параметры).

¬ производных классах перед виртуальной функцией слово virtual можно не писать.

¬иртуальна€ функци€ должна быть об€зательно определена в базовом классе или хот€ бы описана как чиста€ виртуальна€ функци€

virtual тип_результата им€-функции()=0;.

„иста€ виртуальна€ функци€ используетс€ в т.н. абстрактных классах, которые будут рассмотрены позже.

≈сли в производном классе виртуальна€ функци€ не определена, то автоматически вызываетс€ виртуальна€ функци€ из базового класса.

—ледует помнить, что виртуальна€ функци€ не может быть friend и static.

ѕример 1.

#include<stdio.h>

class A

{

рrotected:

int x;

public:

virtual void get_info()

{

puts(У–аботает функци€ базового классаФ);

puts(У¬ведите х=Ф)

scanf(У%iФ, &x);

}

};

class B: public A

{

char* name;

public:

void get_info() // virtual можно не писать

{

name=new char[12];

puts(У–аботает функци€ производного классаФ);

puts(У¬ведите им€Ф);

fflush(stdin);

scanf(У%sФ, name);

}

};

void main()

{

A*p1=new B;// ¬ыделили пам€ть под объект класса ¬ и адрес занесли в указатель //на/базовый класс.

p1→get_info();//¬ызываетс€ get_info() из класса ¬.

¬ w; //w Ц объект класса ¬.

A &pA=w;//pA Ц ссылка на базовый класс, но инициализирована объектом w класса //¬.

pA.get_info();//¬новь вызываетс€ get_info() из класса ¬, но уже с помощью ссылки.

}

 

ѕример 2

#include<stdio.h>

class man

{

рrotected:

char* name;

public:

virtual void input()

{

name=new char[15];

puts(У¬ведите им€Ф);

fflush(stdin);

scanf(У%sФ, name);

}

};

class student:public man

{

char*faculty;

public:

void input()//virtual можно не писать

{

faculty= name char[20];

puts(У¬ведите факультетФ);

fflush(stdin);

scanf(У%sФ, faculty);

}

};

class officer:public man

{

char* zvanie;

public:

void input()//virtual можно не писать

{

zvanie =new char[15];

puts(У¬ведите звание офицераФ);

fflush(stdin);

scanf(У%sФ, zvanie);

}

};

void main()

{

man x;

x.input();//¬ызов из класса man

man*p1=new student;

/*p1 Ц указатель на базовый класс. ¬ него занесли адрес, выделенный под объект класса student*/

p1→input();//¬ызываетс€ input()из класса student.

Student y;

p1=&y;//јдрес объекта класса student занесен в р1.

p1→input();//¬новь вызов input()из класса student.

officer z;

man &w=z;

/* w Ц ссылка на базовый класс man, но инициализирована объектом z производного класса officer */

w.input();//¬ызов input()из класса officer.

}





ѕоделитьс€ с друзь€ми:


ƒата добавлени€: 2015-11-05; ћы поможем в написании ваших работ!; просмотров: 498 | Ќарушение авторских прав


ѕоиск на сайте:

Ћучшие изречени€:

≈сли президенты не могут делать этого со своими женами, они делают это со своими странами © »осиф Ѕродский
==> читать все изречени€...

1546 - | 1504 -


© 2015-2024 lektsii.org -  онтакты - ѕоследнее добавление

√ен: 0.014 с.