On a design note, there are no real problems. The dependency tree is just a bit more complicated, for example if the main program directly uses both classes A and B:
EXE
+--------+
v v
LIB_1 LIB_2
|
v
LIB_2
The major problem is the binary compatibility. Unless you are using pure virtual interfaces, your libs will be inheritable and usable only with executables or dlls made with the same version of the same compiler, with a compatible setup (ie, compatible compiler options).
Along with binary compatibility, dlls usually can have their own heap space. And even with pure virtual interfaces, you need to pay attention to which CRT is used in the dlls (if a dll allocate memory, this and only this dll should deallocate it, thus the same CRT is used for malloc/free).
You can read this SO question and this article for more information. This other article is also a very interessting read when dealing with how to export classes in dlls.