Здравствуйте 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().