API/ABI breaking changes

I like to understand a bit more about ABI and API and how certain changes affect these. It would be quite helpful for me when proposing feature requests on GitHub if know before what consequences would arise.
I have some knowledge about binaries, linking etc. but it is not that deep I could fully understand some dependencies.

Some questions I had the last weeks:

  • Adding a new getXXX to a struct in a header file.
    Changes the API, but won’t break it. Not sure about ABI.
  • Adding or removing a member field to a struct in a header file.
    Breaks API and ABI because the binary representation of the struct changes?
  • Making an existing member function virtual.
    Changes API. Changes ABI also I guess, because virtual leads to different calling convention?

Any helpful links on this topic are very welcome!

Doesn’t break API or ABI.

Doesn’t break API. Breaks ABI in many cases, but not all, such as when external code doesn’t compile sizeof() or allocate on stack.

Breaks ABI, and it depends on what you mean by “breaks API”.

Thank you!