Возможно ли в C ++ иметь класс, переопределяющий виртуальную функцию, но иметь виртуальную диспетчеризацию только тогда, когда функция вызывается через суперкласс (т.е. не когда она вызывается для чего-то статически типизированного в качестве подкласса)?Я знаю, что это не то, что происходит, но есть ли способ достичь чего-то близкого?
Причина, по которой я этого хочу, состоит в том, что у меня есть два класса, которые оба предоставляют функцию flush()
.В большинстве случаев в моей программе я вызываю flush()
непосредственно для объекта подкласса, тип которого мне известен, поэтому мне не нужна виртуальная диспетчеризация.Однако я хочу добавить в класс суперкласс, чтобы очень редко я мог передать ссылку на экземпляр одного из классов в функцию doSomethingThenFlush()
, которая фактически вызывала бы flush()
.
Iзнаю, что я мог бы использовать шаблоны вместо виртуальных функций, и я знаю, что у меня могут быть две разные функции (например, flushVirtual()
, который просто вызывает flushNonVirtual()
, и вызывать flushNonVirtual()
везде, где мне не нужна виртуальная диспетчеризация).Но оба они выглядят как бросание кода в проблему, которая в значительной степени синтаксическая.Есть ли более изящный способ добиться этого?
Возможно, что еще важнее, кто-нибудь знает, почему виртуальность наследуется в C ++?
struct Base
{
virtual ~Base(){}
virtual void func();
};
struct Derived : public Base
{
void func(){}
};
void callVirtually(Base &base)
{
base.func();//this will use virtual dispatch
}
void callStatically(Derived &derived)
{
derived.func();//I don't want/need this to use virtual dispatch
}
int main()
{
Derived derived;
callVirtually(derived);
callStatically(derived);
}