Arun Jacob
Причина моего голосования 1
Попробуйте некоторые интернет-ресурсы/книги.
Причина моего голосования 1
Попробуйте некоторые интернет-ресурсы/книги.
Главным преимуществом виртуальных функций является то, что они непосредственно поддерживают объектно-ориентированное программирование. Когда вы объявляете функцию виртуальной, вы говорите, что именно то, какой код выполняется, зависит от типа объекта, против которого вы его вызываете.
Основным недостатком виртуальных функций является обратная сторона вышесказанного: может быть трудно рассуждать о том, что делает ваш код, просто читая его. Так что если вы видите функцию:
void foo( interface_ptr *p ) { p->a(); p->b(); }
Это очень простой вопрос, лучше вам изучить некоторые основы.
Ключевое слово Virtual позволяет переопределить метод в наследуемом классе.
Виртуальный C#[^]
Виртуальные функции необходимы для поддержки полиморфизма времени выполнения.
class A { public: virtual ~A() {} virtual void hallo() { std::cout << "I'm A[" << this << "]" << std::endl; } }; class B: public A; { public: virtual void hallo() { std::cout << "I'm B[" << this << "]" << std::endl; } }; int main() { static const size_t N = 4; A* v[N]; for(size_t i=0; i<N; i+=2) { v[i] = new A; v[i+1] = new B; } for(size_t i=0; i<N; ++i) v[i]->hallo(); for(size_t i=0; i<N; ++i) { delete v[i]; v[i]=0; } return 0; }
I'm A[0xxxxxxx] I'm B[0yyyyyyy] I'm A[0zzzzzzz] I'm B[0wwwwwww]
Возможно, вам захочется пролистать несколько книг по концепции OOPS, пока вы читаете о виртуальных методах.
виртуальные функции играют важную роль во всех конструкциях фреймворков.
Причина моего голосования 2
неуместное уважение к этому вопросу
Причина моего голосования 1
Не обязательно - по крайней мере один фреймворк использует любопытный повторяющийся шаблон шаблона, чтобы избежать использования виртуальных функций.
>Если класс наследуется от класса, содержащего виртуальную функцию, то определение функции может быть переопределено в наследуемом классе.
Если функция является виртуальной и новое определение функции задано в производном классе, то для любого объекта производного класса этот объект всегда будет использовать новое определение. Даже если он вызывается в унаследованной функции.
Виртуальные функции занимают много места, так как таблица виртуальных функций создается компилятором, который содержит указатели для каждой виртуальной функции-члена, указывающие на место памяти кода для этой функции.
Программы, содержащие виртуальные функции, работают медленно.
Причина моего голосования 1
Большинство вопросов о пространстве и скорости решаются с помощью оптимизации компилятора.
В 2010 году бояться виртуальных функций просто нет смысла.