On 07/06/2017 05:11 PM, unleashy wrote:


Maybe it was an error on my part for not declaring the function as abstract? My view was that the abstract attribute on a class marks all its members as virtual unless they have a body, which is how it works in, say, Java.

Still, kinda odd that the linker is the one to call me out, and not the compiler. Pretty unexpected.


I think an "abstract" class is only one that cannot be directly instantiated, only through a derived class. It might be "complete", though.

This doesn't mean (and that's the confusion) that there couldn't be a function with a body defined in another compilation unit.

In java there are no forward declarations, so there is no ambiguity here: a bodyless method means an abstract method. In D a bodyless method can mean:

* An abstract method (to be provided by derived classes), which of course must then be virtual. This is indicated with the keyword "abstract".
* A method whose body is provided by some other compilation unit.

Of course, an abstract class without abstract methods isn't usually the intended idea... But the compiler will silently accept it and let the linker complain afterwards.

Again, "final by default" to me is more confusing when anything else, specially when it's usually "virtual by default"... and it's clearly a bug that it compiles after explicitly overriding!

Reply via email to