by Ivica Aracic on 09/26/10 02:50:00 am

The following blog post, unless otherwise noted, was written by a member of Gamasutras community.

The thoughts and opinions expressed are those of the writer and not Gamasutra or its parent company.

Every programmer knows the benefits of polymorphism and virtual methods. But only few know about virtual classes (not to be mixed with virtual base classes from C++).

So what is a virtual class? It has its origins in BETA-Programming Language. Basically, it is a nested class (a class in a class), which can be overwritten. Just like a virtual method.

In a fictive C++ like language, an example would look similar to this:

class BaseGraph {

public:

virtual class Node {...};

virtual class Edge {... Node source, target; ...};

};

class ColoredGraph : public BaseGraph {

public:

// overwriting Node and adding the color property to it

virtual class Node {... Color color; ...};

};

Following things happen here:

all nested classes are declared as virtual (can be overwritten)

nested class Node ist overwritten in ColoredGraph

ColoredGraph::Node is a subclass of BaseGraph::Node

all existing references to Node in the context of the ColoredGraph get automatically bound to the overwritten class. Hence, ColoredGraph::Edge::source is a subtype of ColoredGraph::Node and it will have access to the color property. Note that Edge has not been changed at all!

Instantiation looks like this:

BaseGraph* g = new ColoredGraph;

g::Node* node = new g::Node;

The fancy things here are:

g::Node - Node as a property of the object g

late bound new operator - new g::Node will instantiate the Node class depending on the runtime type of g, in this case it will be ColoredGraph::Node.

This is so called family polymorphism (gbeta, Eric Ernst).

If you are interested in a bigger example demonstrating how virtual classes could be applied in the game-programming context, look at V. Gasiunas and I. Aracic. Dungeon: A Case Study of Feature-Oriented Programming with Virtual Classes. 2nd Workshop on Aspect-Oriented Product Line Engineering (AOPLE), Salzburg, Oct 2007.

Also an interesting thing: FeatureC++

I am really, really looking forward to see one day virtual classes being a part of the main-stream technology!