How does lcd.print() in LiquidCrystal work?

Could someone please explain how the lcd.print() function operates? I know the process starts with this line in LiquidCrystal.h: "class LiquidCrystal : public Print {"

I found this statement by mikalhart:

If you look at the declaration for class LiquidCrystal, you'll see that it inherits from class Print. When you call lcd.print, you are actually calling Print::print, which calls LiquidCrystal::send

on the forum in: but to me it might just as well be written in zorkonian by a grue.

Thanks, floresta

This is using a feature of C++ called class inheritance. You'll need to find a good introduction to that language to really understand this. The page at gives some good information, but you'll need to read the earlier parts of that site to get the background needed to understand that article.

Thank's for the reply but it isn't quite what I wanted. I already knew that it used "class inheritance", the tipoff was the phrase "it inherits from class Print". That phrase had previously led me to the cplusplus site where I found even more jargon than in the original post.

You'll need to find a good introduction to that language to really understand this.

Unfortunately an "introduction" probably won't do the trick and anything beyond that seems to rapidly fill with jargon.

Since the only place in the LiquidCrystal library where the word "print" is mentioned is here:

#include "Print.h"
class LiquidCrystal : public Print {

in LiquidCrystal.h this must be where I am supposed to see that "it inherits from class Print". To me this is one of those "clearly we see" or "this is inherently obvious to the most casual observer" statements that I seem to remember from my university days.

I worked through the Arduino Library tutorial but that example is very simple and doesn't use (and therefore doesn't explain) some of the techniques used in the LiquidCrystal library. One of the techniques that the example doesn't use is "class inheritance" which is what prompted my post.

The Library tutorial ends with this paragraph:

That's all for now but I'll probably write an advanced library tutorial soon. In the meantime, if you have any problems or suggestions, please post them to the Software Development forum.

Well folks - here I am! This isn't a suggestion so it must be a problem. Can someone enlighten me.

Thanks again,


Let me give it a try.

Let's say you have class Print that contains members functions a, b, and c. If you have an object of type "Print", you can call those functions with the syntax p.a(), p.b(), p.c(), etc. So far so good?

Let's further say, without going into detail, that you have another class LiquidCrystal that inherits from class Print. That means, roughly, that every LiquidCrystal object is [u]also[/u] a Print object. So a LiquidCrystal object can call Print member functions a, b, and c in addition to whatever functions are defined in LiquidCrystal.

That's why you can write lcd.print(), even though the LiquidCrystal class doesn't (directly) provide a print() method. It's provided by Print!

The magic in this particular design is that the Print class's print() (eventually) calls the mysterious "write" function to "write" a byte. But wait a second! Print doesn't have a "write" function. Where does "write" get defined?! Answer: back down in the LiquidCrystal class.

Just as LiquidCrystal relies on Print to provide the print() function, Print relies on LiquidCrystal to provide the write() function. LiquidCrystal's "write" function is where all the smarts about how to write to an LCD live.

All the other classes that derive from Print provide a write() function too. That's why

lcd.print() -> prints to an LCD (LiquidCrystal) Serial.print() -> prints to a serial port (HardwareSerial) nss.print() -> prints to a software serial port (NewSoftSerial) eth.print() -> prints to an ethernet port (Ethernet) str.print() -> prints to a string (PString)


Thanks Mikal - that's exactly what I was looking for!