if i understand correctly, init needs to be public so that create_a() can call it, but it is not required to be part of A api otherwise.
Correct. If pike had a feature like C++ "friend" then it wouldn't have to be public.
wouldn't in that case making it optional help?
No, optional only helps if the identifier is missing from either class, not if there's a type conflict. I think that is as it should be.