Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Virtual void Func();



};

void A:: Func() {cout<<”A”; }

void B:: Func() {cout<<”B”; }

void C:: Func() {cout<<”C”; }

// Создадим указатель на базовый класс А (не создавая объекта)

// и два объекта типов В и С

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. Механизм виртуального вызова может быть подавлен с помощью использования полного квалифицированного имени.

7. Если базовый класс содержит хотя бы один виртуальный метод, то рекомендуется всегда снабжать этот класс виртуальным деструктором, даже если он ничего не делает. Наличие такого виртуального деструктора предотвратит некорректное удаление объектов производного класса, адресуемых через указатель на базовый класс, так как в противном случае деструктор производного класса вызван не будет.





Дата публикования: 2014-11-28; Прочитано: 209 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...