D provides support for classes and interfaces like in Java or C++.

Any class type inherits from Object implicitly.

class Foo { } // inherits from Object
class Bar : Foo { } // Bar is a Foo too

Classes in D are generally instantiated on the heap using new:

auto bar = new Bar;

Class objects are always reference types and unlike struct aren't copied by value.

Bar bar = foo; // bar points to foo

The garbage collector will make sure the memory is freed when no references to an object exist anymore.


If a member function of a base class is overridden, the keyword override must be used to indicate that. This prevents unintentional overriding of functions.

class Bar : Foo {
    override functionFromFoo() {}

In D, classes can only inherit from one class.

Final and abstract member functions

  • A function can be marked final in a base class to disallow overriding it
  • A function can be declared as abstract to force derived classes to override it
  • A whole class can be declared as abstract to make sure that it isn't instantiated
  • super(..) can be used to explicitly call the base constructor

Checking for identity

For class objects, the == and != operators compare the contents of the objects. Therefore, comparing against null is invalid, as null has no contents. The is compares for identity. To compare for nonidentity, use e1 !is e2.

MyClass c;
if (c == null)  // error
if (c is null)  // ok

For struct objects all bits are compared, for other operand types, identity is the same as equality.


rdmd playground.d