Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Виртуальные методы?


Автор: Grol 4.6.2006, 11:55
Добрый день. Необходимо ответить на вопросы по ООП:
 1. Что такое Виртуальные функции? Для чего они нужны и где применяются?
 2. Что такое Виртуальные деструкторы? Также для чего они нужны и где применяются? Можно напримере не виртуальных деструкторов.
 3. Почему не бывает виртуальных конструкторов (а если бывают точто это такое)?

Всем спасибо заранее за ответы, но небольшая просьба: Пожалуйста отвечайте на вопросы только на те на которые точно знаете ответ. То есть, чтоб не было такого -> "наверное это все таки.....или еще что-то".  

Автор: bel_nikita 4.6.2006, 12:15
Круто!
Возьми книгу Г.Шилда, там все очень хорошо и подробно описано. 

Автор: Fazil6 4.6.2006, 12:50
Цитата

1. Что такое Виртуальные функции? Для чего они нужны и где применяются?

Код

class A
{
public:
        void f1() {std::cout << "A::f1()\n" ;};
        virtual void f2() {std::cout << "A::f2()\n" ;};
};
class B  : public A
{
public 
        void f1() {std::cout << "B::f1()\n" ;};
        virtual void f2() {std::cout << "B::f2()\n" ;};
};

....

A *a;  // может быть указателем на А или его потомка
a = new B();  
a->f1();  // вызовется ф-я A::f1
a->f2();  // вызовется B::f2 потому, что это виртуальная, т.е. этот механизм позволяет вызывать
             //    функции не того класса, который объявлен (А), а того, на который этот указатель 
              // действительно указывает (В) 



Добавлено @ 12:57 
Цитата

 2. Что такое Виртуальные деструкторы? Также для чего они нужны и где применяются? Можно напримере не виртуальных деструкторов.

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

A *a;  // может быть указателем на А или его потомка    
a = new B(); 

delete a;  // если деструктор А не объявлен виртуальным, то в этом месте вызовется именно он, но мы
                //  ведь создавали объект B и должен вызваться деструктор B (для этого делаем деструкторы
                //  виртуальными)  
 

Автор: Fazil6 4.6.2006, 13:05
Цитата

3. Почему не бывает виртуальных конструкторов (а если бывают точто это такое)?

более того в конструкторах виртуальный механизм вообще не действует. Дело в том, что вызов виртуального метода предполагает вызов метода потомка, но если мы вызываем виртуальный метод в конструкторе родителя, к этому моменту еще не вызывался конструктор потомка и члены-данные потомка проинициализированы не могут быть и поэтому вызов метода из  потомка в этот момент не может быть осуществлен.
А виртуальность применительно конструкторов вообще не имеет смысла., потому, что при создании объекта по очереди вызываются все конструкторы по иерархии и выбора что вызывать(как в случае виртуальных ф-й) здесь просто нет   

Автор: Grol 4.6.2006, 15:00
bel_nikita - а есть электронная книга этого автора?
Fazil6 - спасибо попробую разобраться. 

Автор: DeadSoul 4.6.2006, 15:06
Цитата(Grol @  4.6.2006,  15:00 Найти цитируемый пост)
bel_nikita - а есть электронная книга этого автора?

А поиском по форуму пользовались? 

Автор: Xenon 4.6.2006, 16:37
В разделе "книги" 

Автор: MAKCim 4.6.2006, 18:24
Цитата

Почему не бывает виртуальных конструкторов (а если бывают точто это такое)

Язык C++ - статически типизован
При создании объекта его тип точно должен быть известен, потому тут и невозможны в принципе виртуальные механизмы 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)