Yes, the constructor should also move to Ownable.sol as it is part of our “root” functionality which establishes the contract owner on deployment.
You could mark the constructor with internal
visibility, but then you wouldn’t be able to deploy Ownable.sol as a stand-alone contract, only as an inherited contract (i.e. by deploying either Destroyable or HelloWorld). This wouldn’t be a problem in our example, because we only want to deploy HelloWorld (together with its inherited functionality), so you could use either internal
or public
visibility. The issue surrounding constructor visibility is discussed in the following link:
However, we are using Solidity v5, and it is important to note what the last person says in this discussion thread: since Solidity v7 visibility is no longer stated for constructors. Without going into the details, and how this ties in with public v internal visibility, I think for now it’s probably just easier to keep things simple and mark your constructor with public visibility. Not that I don’t want to discourage you from researching more about this yourself if you’re interested to go deeper!

However, it involves the concept of abstract contracts, which are out of the scope of this 101 course.
When I mentioned internal
visibility in my previous post, I was referring to the state variable owner
(not to the constructor). If you mark it with public
, then a getter will automatically be created which can be called from outside to view its value. However, if you want to avoid this, it would be better (in terms of “tighter” code) to use internal visibility, rather than just not state the visibility (as you have currently done).
I hope that makes things clearer 