Важно понимать, что каждый класс определяет собственный интерфейс. Для взаимодействия с объектом типа класса следует использовать интерфейс этого класса, даже если он — часть базового класса в объекте производного.
В результате конструкторы производного класса не могут непосредственно инициализировать члены своего базового класса. Тело конструктора производного класса может присваивать значения его открытых или защищенных членов базового класса. Хотя он
Если в базовом классе определен статический (static) член (см. раздел 7.6), для всей иерархии существует только один его экземпляр. Независимо от количества классов, производных от базового класса, существовать будет только один экземпляр каждого статического члена.
class Base {
public:
static void statmem();
};
class Derived : public Base {
void f(const Derived&);
};
Статические члены подчиняются обычным правилам управления доступом: если член класса объявлен в базовом классе закрытым, производные классы не получат к нему доступа. Когда статический член класса доступен, к нему можно обращаться как из базового, так и из производного класса:
void Derived::f(const Derived &derived_obj) {
Base::statmem(); //
Derived::statmem(); //
//
//
derived_obj.statmem(); //
statmem(); //
}
Производный класс объявляется как любой другой класс (см. раздел 7.3.3). Объявление содержит имя класса, но не включает его список наследования:
class Bulk_quote : public Quote; //
//
class Bulk_quote; //
//
Задача объявления в том, чтобы сообщить о существовании имени и какую сущность он обозначает: класс, функцию или переменную. Список наследования и все другие подробности определения должны присутствовать в теле класса.
Класс должен быть определен, а не только объявлен, прежде чем его можно будет использовать как базовый класс:
class Quote; //
//
class Bulk_quote : public Quote { ... };
Причина этого ограничения очевидна: каждый производный класс содержит и может использовать члены, унаследованные от его базового класса. Чтобы использовать эти члены, производный класс должен знать, что они из себя представляют. Одним из следствий этого правила является невозможность наследования класса от себя самого.
Базовый класс сам может быть производным классом:
class Base { /* ... */ };
class D1: public Base { /* ... */ };
class D2: public D1 { /*...*/ };
В этой иерархии класс Base является D1 и D2. Прямой базовый класс указывают в списке наследования. Косвенный базовый класс наследуется производным через его прямой базовый класс.