Sono d'accordo con la risposta di @Kilian, ma aggiungerò alcuni elementi.
1- In esecuzione su una macchina virtuale non sul sistema operativo
Poiché Java e C # funzionano attraverso una macchina virtuale, ci si aspetta logicamente che non si possa fare esattamente ciò che si vuole quando si è direttamente sul sistema operativo, perché è probabile che si corrompa qualcosa nella VM. Inoltre, essendo Java orientato come indipendente dalla piattaforma, è ancora più logico.
2- Tonnellate di applicazioni non richiedono che tu abbia bisogno di questo tipo di cose.
Ci sono un sacco di applicazioni che non hanno davvero bisogno di te per scavare attraverso gran parte dei dettagli, ma se lo fai con una lingua che ti richiede di farlo, ottieni:
- Più rischi di avere bug dovuti a quelle cose inutili.
- Più costi di sviluppo, gestione della memoria e collaudo richiedono tempo e denaro!
3- La lingua viene calcolata in base al costo / utilizzo / rischio della scelta, come ... tutto.
Con C ++ puoi fare praticamente quello che vuoi, questa è la scelta delle persone C ++. Tuttavia, più c'è, più è necessario gestire.
Quindi cose come l'ereditarietà multipla non vengono abbandonate solo perché sono pericolose, ma vengono abbandonate perché implementarle hanno un costo (sviluppo, manutenzione), tutto questo per una funzionalità che raramente viene utilizzata correttamente e in genere può essere riscritto in modo diverso.