Во-первых, виртуальные функции и то, что вы предлагаете, имеют разную семантику.Если вам нужно другое поведение, потому что у вас разные типы объектов, то вряд ли вы сможете добиться большего успеха, чем реализация виртуальных функций компилятором.Если вам это не нужно, просто не объявляйте функцию виртуальной.
И не беспокойтесь о проблеме производительности, пока не узнаете, что она одна.
Если после полученияРаботая с кодом, вы обнаруживаете проблемы с производительностью из-за вызовов виртуальных функций (обычно из-за того, что компилятор не может встроить функцию, поэтому вы теряете все оптимизации, которые следуют за встраиванием), вы можете, пунктуально, избежать затрат на виртуальные функцииесли вы правильно оформите класс.Предположим, что рассматриваемая функция имеет вид f()
:
class Base
{
virtual void doF() = 0;
public:
void f() { doF(); }
};
class Derived : public Base
{
virtual void doF() { f(); }
public:
void f() { /* ... */ }
};
Если вы делаете это, и у вас есть, например, узкий цикл, где вы постоянно вызываете f()
для одного и того же объекта, вы можетесделать что-то вроде:
void
tightLoop( Base& object )
{
Derived& o = dynamic_cast<Derived&>( object );
for ( /* ... */ ) {
o.f();
}
}
Если вы сделаете это, конечно, tightLoop
может быть вызван только с объектом, который на самом деле Derived
.