在 C++ 中是否可以让一个类覆盖一个虚函数,但只有在通过父类(super class)调用该函数时才具有虚拟分派(dispatch)(即,当它被静态类型为子类的东西调用时不存在)?我知道这不会发生,但有什么方法可以接近吗?
想要这样做的原因是我有两个类都公开了一个 flush()
函数。在我的程序中的绝大多数时间,我直接在我知道类型的子类对象上调用 flush()
,因此我不需要虚拟分派(dispatch)。但是我想在混合中添加一个父类(super class),这样我就可以很少将对任一类的实例的引用传递给 doSomethingThenFlush()
函数,该函数将调用 flush( )
实际上。
我知道我可以使用模板而不是虚函数,而且我知道我可以有两个不同的函数(例如 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);
}
最佳答案
虚拟性是继承的,因为您不知道是否有人会从您的Derived
进一步派生。有人也可以制作一个 MoreDerived
,它可以传递给需要 Derived&
的函数,当他们发现它是 Derived< 时,他们会很难过
版本的所有虚函数都被调用,而不是 MoreDerived
的版本。
如果你的意思是你永远不会从 Derived
继承,所以你不想为虚函数调用付费,那么你就不走运了,因为 C++ 没有提供任何方法来保证您永远不会继承某个类,这是执行您想要的操作所必需的。
关于c++ - 有没有办法不继承子类中函数的 "virtualness"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7102379/