module virtual_poly_runme; import virtual_poly.NDouble; import virtual_poly.NInt; import virtual_poly.NNumber; void main() { // D supports covariant (polymorphic) return types, so this should work like // in C++. auto d = new NDouble(3.5); NDouble dc = d.copy(); if (d.get() != dc.get()) { throw new Exception("Test 1 failed."); } auto i = new NInt(2); NInt ic = i.copy(); if (i.get() != ic.get()) { throw new Exception("Test 2 failed."); } NNumber n = d; auto nd = cast(NDouble) n.copy(); if (nd.get() != d.get()) { throw new Exception("Test 3 failed."); } }