Хотя все остальные правы относительно производительности виртуальных методов и тому подобное, я думаю, что реальная проблема заключается в том, знает ли команда об определении виртуального ключевого слова в C ++.
Рассмотрим этот код, какой вывод?
#include <stdio.h>
class A
{
public:
void Foo()
{
printf("A::Foo()\n");
}
};
class B : public A
{
public:
void Foo()
{
printf("B::Foo()\n");
}
};
int main(int argc, char** argv)
{
A* a = new A();
a->Foo();
B* b = new B();
b->Foo();
A* a2 = new B();
a2->Foo();
return 0;
}
Ничего удивительного здесь:
A::Foo()
B::Foo()
A::Foo()
Поскольку ничто не является виртуальным. Если ключевое слово virtual добавлено в начало Foo в классах A и B, мы получим это для вывода:
A::Foo()
B::Foo()
B::Foo()
В значительной степени то, что все ожидают.
Теперь вы упомянули, что есть ошибки, потому что кто-то забыл добавить виртуальное ключевое слово. Итак, рассмотрим этот код (где виртуальное ключевое слово добавляется в класс А, но не в класс В.) Какой выход тогда?
#include <stdio.h>
class A
{
public:
virtual void Foo()
{
printf("A::Foo()\n");
}
};
class B : public A
{
public:
void Foo()
{
printf("B::Foo()\n");
}
};
int main(int argc, char** argv)
{
A* a = new A();
a->Foo();
B* b = new B();
b->Foo();
A* a2 = new B();
a2->Foo();
return 0;
}
Ответ: Так же, как если бы виртуальное ключевое слово было добавлено в B? Причина в том, что подпись для B :: Foo совпадает точно так же, как A :: Foo (), и поскольку Foo для A является виртуальным, то же самое относится и к B.
Теперь рассмотрим случай, когда Foo B является виртуальным, а A - нет. Какой выход тогда? В этом случае на выходе будет
A::Foo()
B::Foo()
A::Foo()
Виртуальное ключевое слово работает вниз в иерархии, а не вверх. Это никогда не делает методы базового класса виртуальными. Первый раз, когда виртуальный метод встречается в иерархии, это когда начинается полиморфизм. Более поздние классы не могут сделать так, чтобы у предыдущих классов были виртуальные методы.
Не забывайте, что виртуальные методы означают, что этот класс дает будущим классам возможность переопределять / изменять некоторые из его поведений.
Таким образом, если у вас есть правило для удаления виртуального ключевого слова, оно может не дать ожидаемого эффекта.
Виртуальное ключевое слово в C ++ - мощная концепция. Вы должны убедиться, что каждый член команды действительно знает эту концепцию, чтобы ее можно было использовать по назначению.