ВУЗ:
Составители:
Рубрика:
111
cout << ” der::i = ” << i << ‘\n‘;}
};
void main () {
base B, *bp = &B;
der D, *dp = &D;
base *pbd = &D; // Неявное преобразование от der* к base*.
bp->fun (1);
dp->fun (5);
pbd->fun (8);
}
Результат:
base::i = 1
der::i = 5
base::i = 8
Здесь указатель pbd имеет тип base*, но его значение – адрес
объекта D класса der. При вызове функции-члена по указателю на объ-
ект выбор функции зависит только от типа указателя, но не от его
значения, что и иллюстрируется выводом base::i = 8. Настроив указатель
базового класса на объект производного класса, не удается с помощью
этого указателя вызвать функцию из производного класса. Таким спо-
собом не удается достичь позднего или динамического связывания.
Динамическое связывание обеспечивается механизмом виртуаль-
ных функций. Любая нестатическая функция базового класса может
быть сделана виртуальной, если в ее объявлении использовать спе-
цификатор virtual:
class base {
public:
int i;
virtual void print (){
cout << i << “ внутри base\n“;}
};
class D: public base{
public:
void print (){
cout << i << “ внутри D\n“;}
};
Страницы
- « первая
- ‹ предыдущая
- …
- 107
- 108
- 109
- 110
- 111
- …
- следующая ›
- последняя »
