It looks like you are attempting access the base class methods/data from a derived class instance.
Instead of :
auto canvasObj = parseCanvas(one, two);
Three l_three = CanvasObject::ParentOfCanvas->getThree(); //this isn't working
Use :
auto canvasObj = parseCanvas(one, two);
Three l_three = canvasObj.getThree(); // or maybe canvasObj->getThree()
The reason yours didn't work is that it is, sort of, a mis-mash of attempting to access a 'static' member function instead of one on a particular instance. In my solution, I access the 'getThree' data on the canvas object that you created from the return of parseCanvas.
Alternately, if my solution isn't working, then perhaps parseCanvas is returning the wrong data type. That is, I'm expecting it to return CanvasObject, but you didn't provide the signature to that method. You may need to cast or replace auto with the exact type you are looking to have it be (CanvasObject*). Its posisble that parseCanvas might be returning a const type and getThree isn't marked as const, so you'd have trouble calling it.
Maybe if you provided the exact compiler error we could narrow it down further.
EDIT:
Based on your comments, the canvas object is returned a further base class pointer and you are attempting to call a derived class's method. This can't be done. You need to adjust your parseCanvas method to return a derived class pointer or you need to (VERY BAD IDEA) cast your pointer from base class to derived (if you really know that its really that type).