Есть ли способ не наследовать "виртуальность" функции в подклассе?

Возможно ли в 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);
}
9
задан Karu 18 August 2011 в 04:28
поделиться