Abstract Functions

Class member functions (including class operator functions) can be made abstract by using the declaration as follows: int func() = 0;

  • Abstract functions cannot be executed because they do not contain code.
  • An abstract class is a class that either defines or inherits at least one abstract function.
  • Objects of an abstract class can be created, but data members whose type is an abstract class cannot be declared.
  • Abstract types cannot be used as value parameter types or as function return types.
  • shared_ptr and reference function arguments to an abstract class can be declared.
  • A class derived from an abstract class must define all functions that are still abstract as non-abstract.
  • You cannot make the constructor or destructor abstract.
  • Abstract function must not be static.
Restriction: Note that due to the current limitations of the parser, not all illegal lines of code are detected during parsing (i.e. they do not lead to a syntax error even though they are forbidden) and instead trigger a CTRL runtime exception. This applies e.g. to the use of the abstract class as a data type in member functions of the abstract class itself.
// WRONG - DO NOT USE, but does not produce a syntax error:
class Abstract
{
  public void abstractFunc() = 0;
  public Abstract someFunc() { return Abstract(); }
};


// CORRECT usage:
class ILogger
{
  public void write(const string &text) = 0;
};

class MyLogger : ILogger
{
  public void write(const string &text)
  {
    DebugN(text);
  }
};

class MyLogger2 : ILogger
{
  public void write(const string &text)
  {
    DebugN("Another logger: " + text);
  }
};

// "Strategy pattern" / IoC (inversion of control) sample
main(mapping event)
{
  bool use2 = false; //Just change a single line of code (true to false) to use
  shared_ptr<ILogger> f;

  if (use2)
   f = new MyLogger2();
  else
   f = new MyLogger();

  /* If you use this approach/pattern, the advantage is that only one place in the code needs to be adjusted when the logger is changed, 
     see if (use2) above - the f.write() already refers to the correct method */
  f.write("bla");
  f.write("This is a test");
  f.write("This is a test");
  f.write("This is a test");
  f.write("This is a test");
  f.write("This is a test");
}