从派生范围调用函数

时间:2013-06-26 16:08:21

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

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

#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() 而不使用虚函数调用并对函数重载使用不同的表示法:{ {1}}。

有人知道这是否有可能实现?

1 个答案:

答案 0 :(得分:3)

您可以使用所谓的奇怪重复类型模式(CRTP)并使Base成为类模板

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

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

然后,您将从Derived而不仅仅是Base<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