如果我必须重写非虚拟成员函数怎么办

pasbi 1 c++ polymorphism dynamic-binding c++17

假设我们有一个提供课程的图书馆

struct Base { int foo() { return 42; } };

我不能改变那个班级。 99%的人从不愿意重写foo,因此图书馆设计者并未将其虚拟化。但是我需要重写它:

struct MyClass : Base { int foo() { return 73; } };

更糟糕的是,该库具有接受指向的指针的接口Base。我想插入MyClass,但是当然,由于foo它不是虚拟的,因此接口背后的代码始终会调用Base::foo我要它打电话MyClass::foo

我该怎么办?有没有使Base::foo虚拟的常见模式?

实际上Base::fooQAbstractProxyModel::sourceModel。我正在实现ProxyChain,将许多代理模型抽象为一个代理模型。 QAbstractProxyModel::setSourceModel是虚拟的,但QAbstractProxyModel::sourceModel不是虚拟的,这会带来很多麻烦。

void ProxyChain::setSourceModel(QAbstractItemModel* source_model)
{
  for (auto* proxy : m_proxies) {
    proxy->setSourceModel(source_model);
    source_model = proxy;
  }
  QIdentityProxyModel::setSourceModel(source_model);
}

QAbstractItemModel* ProxyChain::sourceModel() const
{
  return m_proxies.front()->sourceModel();
}

Lightness Ra.. 5

我该怎么办?

没有。

这就是为什么指南告诉我们使用的原因,virtual如果我们希望其他人能够“假装”他们的班级是我们班级的版本。

的作者Base没有这样做,所以您没有那种权力。

而已。