// Создадим указатель на базовый класс А ( не создавая объекта)
// и два объекта типов В и С
void main () {
A* ap ;
B* bp = new B;
C* cp = new C;
// в зависимости от значения указателя будет вызываться та или иная виртуальная //функция
ap = bp;
ap->Func();// вызывается функция B:: Func()
ap =cp ;
ap->Func();// вызывается функция C:: Func()
}
2. Рассмотрим случай, когда в некоторую внешнюю функцию передается в качестве аргумента указатель на базовый класс, а сама функция с помощью этого указателя вызывает в своем теле компонентную функцию соответствующего класса, в зависимости от конкретного значения указателя.
void F ( A* a) { a->Func(); }
void main () {
A* ap ;
B* bp = new B;
C* cp = new C;
ap = bp;
F( ap ); // в Fвызывается B:: Func()
ap = cp;
F( ap ); // в Fвызывается C:: Func()
3. Передавать в функциюF() можно не только указатель на базовый класс, но и ссылку на базовый класс:
void F ( A& a) { a . Func(); }
void main () {
A* ap ;
B* bp = new B;
C* cp = new C;
ap = bp;
F( *ap ); // в Fвызывается B:: Func()
ap = cp;
F( *ap ); // в Fвызывается C:: Func()
4. Иногда указатель на базовый класс удобно инициировать адресами статических объектов производных классов
void F ( A* a) { a->Func(); }
void main () {
B b;
C c ;
A* ap;
ap = &b;
F( ap ); // в Fвызывается B:: Func()
ap = &c;
F( ap ); // в Fвызывается C:: Func()
5. Можно использовать механизм виртуальных функций, если указатели на объекты производных классов объявить типа указателя на базовый класс:
void main () {
A* bp = new B;
A* cp = new C;
bp->Func();// вызывается функция B:: Func()
cp->Func();// вызывается функция C:: Func()
cp=bp;
cp->Func();// вызывается функция B:: Func()
6. Механизм виртуального вызова может быть подавлен с помощью использования полного квалифицированного имени.