2013-11-20 4 views
-3

В последнее время мне задали этот самый простой вопрос.Необходимость в виртуальных функциях

Зачем нам нужны виртуальные функции или полиморфизм в этом отношении?

Я дал различные ответы от проектов реального времени, объясняющих, как это работает, но не смог ответить на самый простой вопрос, относящийся к необходимости. Мой вопрос (или его QNS был)

Я в любом случае собираюсь сделать ниже, чтобы вызвать соответствующие функции:

<base class> b = new <derived class>; 
b.foo(); 

//can also be implemented as 
<derived class> d = new <derived class>(); 
d.foo(); 

Эта выше не выполняется решение времени, как я знаю, что во время написания моего код, который я собираюсь поместить в базу тип производного объекта. Вышеизложенное также может быть реализовано непосредственно, как показано выше. Так почему же виртуальный?

ответ

2

Очень простой пример показывает, что вам нужны виртуальные функции (или полиморфизм вообще) для ведения объектов в зависимости от параметров времени выполнения.

animal* cute = nullptr; 

animal_type type = get_animal_type_from_user_input(); 
//^Value depends on user input at runtime, unless we have some crystal ball 
//  or time machine, we won't know what type of animal it would be 

if(type == cat) { 
    cute = new cat; 
} 
else if(type == dog) { 
    cute = new dog; 
} 

cute->fuss(); // Depends if cat or dog; we won't know until runtime 
+0

Но вы не можете использовать какие-либо производные свойства, используя базовый указатель cute, который не наследуется. – Subhajit

+0

@Subhajit В принципе, точка. Цель базового класса - предоставить общий набор методов, которые могут быть и будут унаследованы и переопределены производными классами. Вы получаете доступ к 'cat' или' dog' через указатель «animal», потому что таким образом мы можем безопасно называть методы «animal», и поведение по-прежнему будет определяться производным классом. Однако доступ к производным частям потребует отбросов и в основном ужасных вещей, которые лучше всего оставить, если вы очень уверены в том, что делаете. –

+0

@Subhajit Что-то действительно должно приносить и жертвовать, если мы используем гибкость полиморфизма. Потеря информации о типе, часто использование динамического распределения и другие недостатки, и это наша работа в качестве программистов, чтобы взвесить плюсы и минусы какой-либо техники, если мы будем использовать их. –

1

Виртуальные функции необходимы, когда вы хотите переопределить поведение метода в базовом классе с помощью метода из класса ребенка во время выполнения через указатель базового класса. Очень хороший пример/образцы здесь:

http://www.cplusplus.com/forum/beginner/13885/

0

Различные формы полиморфизм позволяют одинаковому (более высокий уровень клиента/алгоритмический) процесс Кода данные различных типов. Например, написание кода для контейнера, который может хранить данные любого типа, или сортировать контейнер любого типа, или рассчитывать оплату для любого типа сотрудника или подрядчика. Полиморфизм времени выполнения (виртуальные функции) позволяет сделать это, когда данные не известны до времени выполнения.

Смежные вопросы