pas*_*sbi 1 c++ polymorphism dynamic-binding c++17
假设我们有一个提供课程的图书馆
struct Base { int foo() { return 42; } };
Run Code Online (Sandbox Code Playgroud)
我不能改变那个班级。
99%的人从不愿意重写foo,因此图书馆设计者并未将其虚拟化。但是我需要重写它:
struct MyClass : Base { int foo() { return 73; } };
Run Code Online (Sandbox Code Playgroud)
更糟糕的是,该库具有接受指向的指针的接口Base。我想插入MyClass,但是当然,由于foo它不是虚拟的,因此接口背后的代码始终会调用Base::foo。我要它打电话MyClass::foo。
我该怎么办?有没有使Base::foo虚拟的常见模式?
实际上Base::foo是QAbstractProxyModel::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();
}
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
没有。
这就是为什么指南告诉我们使用的原因,virtual如果我们希望其他人能够“假装”他们的班级是我们班级的版本。
的作者Base没有这样做,所以您没有那种权力。
而已。
| 归档时间: |
|
| 查看次数: |
70 次 |
| 最近记录: |