我有一些代码似乎与此类似:
#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}}。
有人知道这是否有可能实现?
答案 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。