Files
2025-09-18 17:55:52 -04:00

58 lines
2.1 KiB
C

#pragma once
/*
http://msdn.microsoft.com/en-us/magazine/cc301398.aspx
These days abstract classes are
not just common, they're ubiquitous. Think: where in Windows® do
abstract classes appear over and over again? That's right, in COM!
A COM interface is an abstract class with only pure virtual functions.
As everything in Windows migrates to COM land, Windows-based programs
have COM interfaces up the wazoo. A typical COM class might implement
a dozen or more interfaces, each with several functions.
Even outside COM, the notion of an interface is quite powerful
and useful, as in the Java language. Each interface implementation might
use several layers of classes, none intended to be used by themselves,
but only as base classes for yet more classes. ATL provides many such
classes using templates, another source of class proliferation. All of
this adds up to lots of initialization code and useless vtables with
NULL entries. The total bloat can become significant, especially when
you're developing small objects that must load over a slow medium like
the Internet.
So __declspec(novtable) was invented to solve the problem. It's a
Microsoft-specific optimization hint that tells the compiler: this class
is never used by itself, but only as a base class for other classes, so
don't bother with all that vtable stuff, thank you.
*/
#ifdef _WIN32
// Decoration to indicate a class is to be treated as an "Interface"
// The class should contain pure virtual functions and maybe a little
// trivial code. Otherwise, use RBXBaseClass.
// !!! You can't define a virtual destructor for a class of this type
#define RBXInterface __declspec(novtable)
// Decoration to indicate a class should not be instantiated directly
// !!! You can't define a virtual destructor for a class of this type
#define RBXBaseClass __declspec(novtable)
/****
Note:
C++ doesn't have a strict "Interface" type. RBXInterface should be used
for classes that declare only pure virtual functions and maybe a constructor
and/or a field. Classes that define non-trivial code should use RBXBaseClass instead.
***/
#else
#define RBXInterface
#define RBXBaseClass
#endif