There just isn't any need to export the concrete class. The v-table you get from the Interface pointer will be set to the concrete v-table stored inside the DLL. Which already has all the function pointers set correctly to the implementation methods. So once you got the v-table pointer then you're golden and can call any of the concrete methods. Compare with COM, you never export anything from a COM server, other than the factory function (DllGetClassObject).
You do have to export the construct() function, there isn't any other way that external code can obtain the address of this function. A lookup table is required that maps the function name to the function address. The export table of the DLL. Exporting functions and classes add entries to that export table.