Why is the ERC721 contract not marked as abstract even though it has unimplemented functions?

The Solidity docs mention that: "Contracts need to be marked as abstract when at least one of their functions is not implemented." https://docs.soliditylang.org/en/v0.6.2/contracts.html#abstract-contracts

However, ERC721.sol in OZ implementation is not marked as abstract, even though _beforeTokenTransfer() and _afterTokenTransfer() are not implemented. Why is this the case? How is this possible?

Nevermind. They are implemented. It's just a bit hard to tell, but the curly brackets {} are there. The functions just do nothing.