Virtual functions are called through a vtable, which is basically an array of function pointers. So, every time one is called, there's an extra array lookup. I'm not sure if I'd call this a huuuuge nono though, in general they should be pretty fast.
From Wikipedia:
A virtual call requires at least an extra indexed dereference, and
sometimes a "fixup" addition, compared to a non-virtual call, which is
simply a jump to a compiled-in pointer. Therefore, calling virtual
functions is inherently slower than calling non-virtual functions. An
experiment done in 1996 indicates that approximately 6–13% of
execution time is spent simply dispatching to the correct function,
though the overhead can be as high as 50%.[4] The cost of virtual
functions may not be so high on modern CPU architectures due to much
larger caches and better branch prediction.