【问题标题】:Calling function from derived scope从派生范围调用函数
【发布时间】:2013-06-23 21:26:45
【问题描述】:

我有一些与此类似的代码:

#include <iostream>

class Base {
public:
    void test() {
        std::cout << "Base::test()" << std::endl; 
    }

    void test2() {
        test();
    }
};

class Derived : public Base {
public:
    void test() {
        std::cout << "Derived::test()" << std::endl;
    }
};

int main() {
    Derived d;
    d.test2();
    return 0;
}

现在这个输出当然是Base::test(),但是我希望它输出Derived::test() 使用虚函数调用并为函数重载使用不同的符号:Derived::test

有人知道这是否可以实现吗?

【问题讨论】:

  • 如果我理解你的正确你希望 d.test2() 直接调用 d.test(),对吗?据我所知,没有虚拟功能就无法做到这一点。他们的目的正是针对这种情况。
  • 是的,没有重载Base::test2(),没有为Derived 使用不同的表示法,也没有损失性能(例如虚函数调用)。
  • 你可以修改Base吗?
  • @Tim 你真的验证过虚函数调用会显着影响性能吗?
  • @Tim 这正是“过早优化”的意思。很多时候,您认为可能存在瓶颈的地方并不是它实际所在的地方。如果您担心性能,请先编写没有优化的代码,然后对其进行测量,然后再优化实际上拖慢您速度的部分。

标签: c++ inheritance c++11 scope


【解决方案1】:

您可以使用所谓的 Curiously Recurring Type Pattern (CRTP) 并将Base 设为类模板

template<typename D>
class Base {
public:
    void test() {
        std::cout << "Base::test()" << std::endl;
    }

    void test2() {
        (static_cast<D*>(this))->test();
    }
};

然后,您将从Base&lt;Derived&gt; 派生Derived 而不仅仅是Base

class Derived : public Base<Derived> {
//                     ^^^^^^^^^^^^^
//                     This is the only change required in Derived
public:
    void test() {
        std::cout << "Derived::test()" << std::endl;
    }
};

这是live example

【讨论】:

  • 然后他必须检查哪个更快 - 强制转换或虚函数调用。
  • @KamenStoykov 转换可以在构造函数中完成。 @AndyProwl 这是一个不错的解决方案,但我认为我没有将Base 的继承类型更改为模板类Base&lt;T&gt; 的奢侈。一些派生类已经实现。
  • @Tim:我明白了。那我真的不相信除了使用虚函数还有别的办法。
  • @AndyProwl 谢谢。存储虚函数不会造成任何性能损失,对吧?
  • @Tim:“存储虚函数”是什么意思?
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 2014-01-26
  • 2011-06-19
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
相关资源
最近更新 更多