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");
}