Давайте сначала подумаем, почему вы хотите иметь базовый класс. Я могу придумать несколько разных причин:
- Для поддержки общих операций или коллекций, которые будут работать с объектами любого типа.
- Включить различные процедуры, которые являются общими для всех объектов (например, управление памятью).
- Все является объектом (без примитивов!). Некоторые языки (например, Objective-C) не имеют этого, что делает вещи довольно грязными.
Это две веские причины, по которым языки брендов Smalltalk, Ruby и Objective-C имеют базовые классы (технически Objective-C на самом деле не имеет базового класса, но для всех целей и задач, он имеет ).
Для # 1 необходимость в базовом классе, объединяющем все объекты в едином интерфейсе, устраняется путем включения шаблонов в C ++. Например:
void somethingGeneric(Base);
Derived object;
somethingGeneric(object);
не требуется, если вы можете поддерживать целостность типов с помощью параметрического полиморфизма!
template <class T>
void somethingGeneric(T);
Derived object;
somethingGeneric(object);
Для # 2, тогда как в Objective-C процедуры управления памятью являются частью реализации класса и наследуются от базового класса, управление памятью в C ++ выполняется с использованием композиции, а не наследования. Например, вы можете определить оболочку умного указателя, которая будет выполнять подсчет ссылок для объектов любого типа:
template <class T>
struct refcounted
{
refcounted(T* object) : _object(object), _count(0) {}
T* operator->() { return _object; }
operator T*() { return _object; }
void retain() { ++_count; }
void release()
{
if (--_count == 0) { delete _object; }
}
private:
T* _object;
int _count;
};
Тогда вместо вызова методов самого объекта вы будете вызывать методы в его оболочке. Это не только позволяет более общее программирование: оно также позволяет вам разделить задачи (поскольку в идеале ваш объект должен быть более озабочен тем, что он должен делать, чем тем, как следует управлять его памятью в различных ситуациях).
Наконец, в языке, который имеет как примитивы, так и реальные объекты, такие как C ++, преимущества наличия базового класса (согласованного интерфейса для каждого значения) теряются, так как тогда у вас есть определенные значения, которые не могут соответствовать этому интерфейсу. Чтобы использовать примитивы в такой ситуации, вам нужно поднять их в объекты (если ваш компилятор не сделает это автоматически). Это создает много осложнений.
Итак, короткий ответ на ваш вопрос: C ++ не имеет базового класса, потому что, имея параметрический полиморфизм через шаблоны, он не должен.