Nunca he escuchado el concepto señalado en tu pregunta de "clase abstracta basamental". Diría que no se usa en Programación Orientada a Objetos.
Ya respondiendo a tu pregunta, las clases concretas (no abstractas) no necesariamente deben heredar o basarse en una clase abstracta.
En realidad las clases abstractas son un recurso que hay que usar cuando se necesita, no de manera necesaria para que toda clase tenga una base abstracta.
El típico ejemplo es el del "mamífero". No existe el "mamífero" como tal y por tanto debería ser una clase abstracta. Puede tener características como tiempo de gestación, número de mamas, etc., que son heredadas por todos los mamíferos. En ese caso puede ser útil crear la clase "Mamifero" como abstracta, para evitar que nadie instancie objetos "Mamifero".
Pero que en una aplicación tengas una clase abstracta como "Mamífero" no quiere decir que la necesites siempre. Igual tienes una aplicación donde esa clase es concreta, o igual tienes una aplicación en la que no necesitas tener esa clase abstracta para nada. Puedes tener "Perro" y "Gato" y ser clases totalmente independientes que no tienen una clase abstracta en común. Si no te aporta nada, podrías perfectamente no basarte en esa clase "Mamifero".
Otro ejemplo cualquiera... La clase "Potencia", que sirva para calcular valores de una base elevado a un exponente. Esa clase no necesita basarse en ninguna clase abstracta como "OperaciónMatematica". No hay motivo para que "Potencia" requiera tener un padre o abuelo que sea una clase abstracta.