Возможно ли в C++ иметь переопределение виртуальной функции классом, но иметь виртуальную диспетчерскую только тогда, когда функция вызывается через суперкласс (т.е. не тогда, когда она вызывается на что-то статически набранное в качестве подкласса)? Я знаю, что это не то, что происходит, но есть ли способ достичь чего-то близкого?
Причина желания этого заключается в том, что у меня есть два класса, которые открывают функцию flush()
. Подавляющее большинство времени в моей программе я вызываю flush()
непосредственно на объект подкласса, который мне знаком, так что мне не нужна виртуальная диспетчеризация. Однако я хочу добавить в микс суперкласс, чтобы очень редко я мог передать ссылку на экземпляр любого из классов в функцию doSomethingThenFlush()
, которая вызовет flush()
виртуально.
Я знаю, что мог бы использовать шаблоны вместо виртуальных функций, и я знаю, что мог бы иметь две разные функции (например, flushVirtual()
, которые просто вызывали flushNonVirtual()
, и вызывали flushNonVirtual()
везде, где мне не нужна виртуальная диспетчеризация). Но и то, и другое кажется немного похожим на подбрасывание кода к проблеме, которая во многом синтаксична. Есть ли более элегантный способ добиться этого?
Возможно, что более важно, знает ли кто-нибудь, почему виртуальность наследуется в Си++?
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);
}