c++ - 有没有办法不继承子类中函数的 "virtualness"?

标签 c++ virtual

在 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/

相关文章:

实现接口(interface)的类中的c#虚方法

c++ - 对于虚函数,在声明为虚函数和未声明为虚函数时访问某些方法时会发生什么

c++ - 覆盖 Direct3D 接口(interface)?

c++ - Qt 的 C++ 接口(interface)

java - 通过虚拟实现对派生类型的静态方法调用? (安卓)

c++ - 如何定义存在于不同文件中的同名函数

c++ - 如何在 C++ builder 中渲染 openGL 帧?

c++ - 我怎样才能用静态变量(C++)干掉这些函数?

c++ - 部分类型作为模板参数 C++

c++ - 即使我返回 -1 程序仍然运行?