未定义printf却可调用?TextLCD适配LCDInterface接口遇编译问题
mbed TextLCD适配LCDInterface接口问题解答
问题1:未在cpp中定义的TextLCD::printf()为何能正常工作?
TextLCD类继承自mbed的Stream类,而Stream已经完整实现了int printf(const char* format, ...)方法。TextLCD头文件中的printf声明只是对父类方法的重声明,目的是让该方法在TextLCD的公开接口中可见,实际执行时会调用父类Stream的实现,因此不需要在TextLCD的cpp文件中单独定义也能正常运行。
问题2:如何解决添加override后的编译错误?
编译错误的核心原因是:LCDInterface是独立的纯虚接口,TextLCD继承的Stream::printf并不会自动作为LCDInterface纯虚函数的实现。需要在TextLCD中显式实现LCDInterface的printf方法,直接委托给Stream的实现即可,具体步骤如下:
- 在TextLCD类的头文件中,给
printf、locate、cls添加override关键字,并确保方法签名与LCDInterface完全一致:
class TextLCD : public Stream, public LCDInterface { public: // 其他已有成员... int printf(const char* format, ...) override; void locate(int column, int row) override; void cls() override; };
- 在TextLCD的cpp文件中实现
printf方法,直接调用父类Stream的实现:
int TextLCD::printf(const char* format, ...) { va_list args; va_start(args, format); int result = Stream::vprintf(format, args); va_end(args); return result; }
如果locate和cls在TextLCD中已有实现,只需保留cpp中的原有实现即可,无需额外修改。
这样编译器就能识别到TextLCD已经完整实现了LCDInterface的所有纯虚函数,编译错误即可解决。
内容的提问来源于stack exchange,提问作者Will Powell
相关产品推荐
相关产品推荐

