Зачем нужны виртуальные функции?
От: NetMinion  
Дата: 05.01.02 14:45
Оценка:
Помогите разобраться в этом вопроссе...
Технологию вроде понял, но как все это может быть применено на практике не понимаю (можно же просто переопределить функцию в производном классе, да и функции произв. класса не видны при указателе на родит. класс)...
если у кого есть опыт расскажите плз..
Заранее благодарен, NetMinion...
NetMinion
Re: Зачем нужны виртуальные функции?
От: Хитрик Денис Россия RSDN
Дата: 05.01.02 17:50
Оценка:
Здравствуйте NetMinion, Вы писали:

NM>Помогите разобраться в этом вопроссе...

NM>Технологию вроде понял, но как все это может быть применено на практике не понимаю (можно же просто переопределить функцию в производном классе, да и функции произв. класса не видны при указателе на родит. класс)...
NM>если у кого есть опыт расскажите плз..
NM>Заранее благодарен, NetMinion...

http://www.firststeps.ru/theory/oop/oop1.html
Правила нашего с вами форума.
Как правильно задавать вопросы. © 2001 by Eric S. Raymond; перевод: © 2002 Валерий Кравчук.
Re: Зачем нужны виртуальные функции?
От: Кривенко Антон Владимирович  
Дата: 05.01.02 19:08
Оценка:
Нуу... Странный вопрос. Видимо Вы никогда не писали крупные проекты с использованием С++? Простой пример:

Мне надо поддерживать Nое количество SCSI адаптеров в ПК. Т.е. как минимум уметь их продетектировать. Я пишу:

class CScsiAdapter
{
public:

CScsiAdapter ();
~CScsiAdapter ();

virtual BOOL Detect (void);
}

Потом я пишу кучу производных классов, в которых переопределяю метод Detect(). Теперь пишем функцию:

BOOL DetectScsi(CScsiAdapter * pAdapter)
{
return pAdapter->Detect();
}

В функцию передаются указатели на объекты производных классов. В этом случае я могу быть уверенным, что вызовется именно тот Detect, какой надо, а не базовый.

Пример оооочень упрощенный, но практически постоянно я пишу что-то подобное (только много сложнее архитектурно). Вот так.
Re: Зачем нужны виртуальные функции?
От: Lummox  
Дата: 07.01.02 16:39
Оценка:
Здравствуйте NetMinion, Вы писали:

NM>Помогите разобраться в этом вопроссе...

NM>Технологию вроде понял, но как все это может быть применено на практике не понимаю (можно же просто переопределить функцию в производном классе, да и функции произв. класса не видны при указателе на родит. класс)...
NM>если у кого есть опыт расскажите плз..
NM>Заранее благодарен, NetMinion...
Вот достаточно бессмысленный, но не смотря на это, очень полезный и понятный пример того, зачем нужны виртуальные методы (советую для пущей наглядности и понятности скопировать и запустить этот пример):

#include<stdio.h>
class A{
public:
A(){}
virtual char *method();
};
class A1:public A{
public:
A1(){}
char *method();
};
class A2:public A{
public:
A2(){}
char *method();
};
char *A::method(){return "Base Class";}
char *A1::method(){return "First Derived";}
char *A2::method(){return "Second Derived";}
void main(){
A *ptr=&A();
printf("%s\n",ptr->method());
ptr=&A1();
printf("%s\n",ptr->method());
ptr=&A2();
printf("%s.",ptr->method());
}
//конец примера
будет выведено:
Base Class
First Derived
Second Derived.
Это не смотря на то, что во всех случаях используется одна переменная типа А.
Теперь, — если убрать метку virtual:
Base Class
Base Class
Base Class.
Иными словами, то какой именно виртуальный метод использовать, выясняется непосредственно в момент исполнения программы, исходя из типа, присвоенного к указателю ptr.
Если method() не является выртуальным, то транслятор посмотрит какому классу принадлежит ptr, и везде, где имеет место обращение к method(), он будет использовать метод char *A::method().
В том случае когда method() виртуален, транслятор не анализирует его, он попросту игнорирует это дело. Только в момент исполнения этой строчки уже ЗАГРУЗЧИК будет определять тип ptr и использовать НАДЛЕЖАЩИЙ method().

Вот, собственно и весь рассказ...
В отличье от себя — тебе я верю...
Re: Зачем нужны виртуальные функции?
От: Аноним  
Дата: 07.01.02 16:45
Оценка:
Здравствуйте NetMinion, Вы писали:

NM>Помогите разобраться в этом вопроссе...

NM>Технологию вроде понял, но как все это может быть применено на практике не понимаю (можно же просто переопределить функцию в производном классе, да и функции произв. класса не видны при указателе на родит. класс)...
NM>если у кого есть опыт расскажите плз..
NM>Заранее благодарен, NetMinion...

Еще один пример: вируальный деструктор
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.