【问题标题】:C++ avoiding dynamic dispatch in derived classes with using keywordC++ 避免在派生类中使用 using 关键字进行动态分派
【发布时间】:2013-10-02 12:12:08
【问题描述】:

在下面的例子中,我会使用动态调度来调用虚函数吗?

struct Base{
    virtual double fn(){return 3.2;}
};
struct Deri1 : public Base{
    using Base::fn;
}
struct Deri2 : public Base{
    virtual double fn(){return 4.6;}
}

我正在实现的类包含更多信息,但有些我想为某些派生类保留默认值,但在其他类中覆盖,上面代码中的 fn() 就是一个例子。基本上,我只是使用基类来避免每次没有被覆盖时重写 fn() 。这是正确的方法吗?

谢谢!

【问题讨论】:

  • Deri2 不继承自 Base。这是故意的吗?
  • 糟糕!对不起!我现在已经更正了。
  • 在这种情况下,您甚至不需要使用 using 指令。只有当你重载函数时,除了不想重写它。
  • 谢谢,但我宁愿避免动态调度,即使用 vtables 来确定虚函数。此外,在扩展程序中,还会发生一些重载。
  • 如果你不想动态调度,就不要做函数virtual

标签: c++ virtual-functions dynamic-dispatch


【解决方案1】:

可以通过在函数定义中避免使用“virtual”关键字来避免动态调度,只要不使用指针,正如link 中所解释的那样。

这会给泛型方法和多态性带来一些复杂性。如果使用动态多态性,则将指向基类的指针传递给方法,在这种情况下,指针必须使用“virtual”关键字来确定要使用的方法。可以使用模板定义静态多态方法,如下面的link 所述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多