Ну, virtual
- это то, что встроено в C ++ для поддержки OOD полиморфизма (в частности, времени выполнения или динамического единицы).
Когда вы хотите, чтобы разные объекты одного типа (Animal
) вели себя по-разному (getProduceName()
возвращает «свинину», «говядину», «яйцо» или ...) в зависимости от контекста (является ли Animal
на самом деле Pig
или Cow
, или Chicken
, или ...) вы делаете это поведение / функцию virtual
.
Обычно хороший OOD будет иметь хорошее разделение интерфейса / реализации. В C ++ это реализуется с использованием наследования вместе с abstract
классами / методами.
Таким образом, на самом деле, когда вы делаете getProduceName()
полиморфный / virtual
, вы на самом деле пытаетесь извлечь интерфейс (Animal
) из различных реализаций (Pig
или Cow
или Chicken
или ...) чтобы защитить ваш клиентский код от различных реализаций. Таким образом, если вам нужно поддерживать новую реализацию, вам не нужно менять клиентский код, пока он придерживается интерфейса Animal
.
Итак, чтобы ответить на вопрос: Должен ли метод быть виртуальным, если его объект не создан во время компиляции?
Является ли метод виртуальным или нет, не зависит от того, когда был создан объект (компиляция / время выполнения). Это зависит от того, как вы хотите разработать приложение. Создание функции virtual
поможет вам извлечь интерфейс из различных реализаций. Если определенная функция (getOwnerName()
) имеет одинаковую реализацию во всех реализующих классах ({return ownerName;}
), ее не нужно делать виртуальной.
PS: ИМХО полиморфизм - это побочный продукт хорошего OOD, вы не разрабатываете свои классы для реализации «полиморфизма времени выполнения», а затем демонстрируете полиморфизм времени исполнения, когда у вас хороший дизайн OO.