c++ 为什么CRTP在以下功能中不工作?

x6yk4ghg  于 2024-01-09  发布在  其他
关注(0)|答案(1)|浏览(145)

我在学习CRTP C++模式
我的代码

  1. template<class Type>
  2. class BaseOrder {
  3. public:
  4. void sendOrder() {static_cast<Type*>(this)->send();}
  5. void send() { cout << "Send Base" << endl;}
  6. };
  7. class DerivedOrder1 : public BaseOrder<DerivedOrder1> {
  8. public:
  9. void send() { cout << "Send DerivedOrder1" << endl;}
  10. };
  11. class DerivedOrder2 : public BaseOrder<DerivedOrder2> {
  12. public:
  13. void send() { cout << "Send DerivedOrder2" << endl;}
  14. };
  15. template<class T>
  16. void handleOrder(BaseOrder<T> order) {
  17. order.send();
  18. }
  19. int main() {
  20. BaseOrder<DerivedOrder1> obj1;
  21. handleOrder(obj1); // Send Base
  22. BaseOrder<DerivedOrder2> obj2;
  23. handleOrder(obj2); // Send Base
  24. }

字符串
我看到输出:

  1. Send Base
  2. Send Base


但我预计

  1. Send DerivedOrder1
  2. Send DerivedOrder2


如何修复我的代码?我错过了什么吗?

jm81lzqq

jm81lzqq1#

你的代码中有几个错误:
send不是virtual,你可能想调用sendOrder。你应该通过引用传递这个参数,以避免切片,这将使调用sendOrder UB,因为转换将是无效的:

  1. template <class T>
  2. void handleOrder(BaseOrder<T>& order) {
  3. order.sendOrder();
  4. }

字符串
在main中,你不创建派生类,它应该是

  1. DerivedOrder1 obj1;
  2. handleOrder(obj1); // Send Base
  3. DerivedOrder2 obj2;
  4. handleOrder(obj2); // Send Base


Demo
为了避免这些错误,一个改进是将一些方法protected

  1. template<class Type>
  2. class BaseOrder {
  3. protected:
  4. BaseOrder() = default;
  5. BaseOrder(const BaseOrder&) = default;
  6. BaseOrder& operator=(const BaseOrder&) = default;
  7. public:
  8. // ..
  9. };


Demo

展开查看全部

相关问题