0

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

#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

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

4

1 回答 1

3

您可以使用所谓的 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();
    }
};

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;
    }
};

这是一个活生生的例子

于 2013-06-26T16:17:17.807 回答