【发布时间】:2021-10-30 14:47:29
【问题描述】:
我试图了解 https://github.com/vshymanskyy/TinyGSM/tree/master/src 的内部结构,但对类的构造方式感到困惑。
我特别看到在 TinyGsmClientBG96.h 中他们定义了一个继承自多个模板化父类的类。
class TinyGsmBG96 : public TinyGsmModem<TinyGsmBG96>,
public TinyGsmGPRS<TinyGsmBG96>,
public TinyGsmTCP<TinyGsmBG96, TINY_GSM_MUX_COUNT>,
public TinyGsmCalling<TinyGsmBG96>,
public TinyGsmSMS<TinyGsmBG96>,
public TinyGsmTime<TinyGsmBG96>,
public TinyGsmGPS<TinyGsmBG96>,
public TinyGsmBattery<TinyGsmBG96>,
public TinyGsmTemperature<TinyGsmBG96>
很公平。如果我查看其中之一,例如 TinyGsmTemperature,我会发现一些令人困惑的代码。
看起来静态转换已经到位,因此我们可以调用与硬件无关的接口 getTemperature() 并使用 TinyGsmBG96 中定义的实现。
- 在这种情况下为什么不使用函数覆盖?
- 这个实现背后的想法是什么?
- 这是 c++ 中的常见模式吗?
template <class modemType>
class TinyGsmTemperature
{
public:
/*
* Temperature functions
*/
float getTemperature()
{
return thisModem().getTemperatureImpl();
}
/*
* CRTP Helper
*/
protected:
inline const modemType &thisModem() const
{
return static_cast<const modemType &>(*this);
}
inline modemType &thisModem()
{
return static_cast<modemType &>(*this);
}
float getTemperatureImpl() TINY_GSM_ATTR_NOT_IMPLEMENTED;
};
【问题讨论】:
标签: c++ inheritance overriding virtual crtp