我正在学习CRTP C++模式
我的代码
template<class Type>
class BaseOrder {
public:
void sendOrder() {static_cast<Type*>(this)->send();}
void send() { cout << "Send Base" << endl;}
};
class DerivedOrder1 : public BaseOrder<DerivedOrder1> {
public:
void send() { cout << "Send DerivedOrder1" << endl;}
};
class DerivedOrder2 : public BaseOrder<DerivedOrder2> {
public:
void send() { cout << "Send DerivedOrder2" << endl;}
};
template<class T>
void handleOrder(BaseOrder<T> order) {
order.send();
}
int main() {
BaseOrder<DerivedOrder1> obj1;
handleOrder(obj1); // Send Base
BaseOrder<DerivedOrder2> obj2;
handleOrder(obj2); // Send Base
}
我看到输出:
Send Base
Send Base
但我期待
Send DerivedOrder1
Send DerivedOrder2
如何修复我的代码?我错过了什么吗?
您的代码中有几个错误:
send
不是 virtual
,您可能想改为拨打 sendOrder
。
并且您应该通过引用传递该参数,以避免切片,这会调用 sendOrder
UB,因为转换将无效:
template <class T>
void handleOrder(BaseOrder<T>& order) {
order.sendOrder();
}
在main中,你没有创建派生类,它应该是
DerivedOrder1 obj1;
handleOrder(obj1); // Send Base
DerivedOrder2 obj2;
handleOrder(obj2); // Send Base
避免这些错误的改进是制定一些方法
protected
:
template<class Type>
class BaseOrder {
protected:
BaseOrder() = default;
BaseOrder(const BaseOrder&) = default;
BaseOrder& operator=(const BaseOrder&) = default;
public:
// ..
};