Поделиться через


Инициализация базовых классов

Прямые базовые классы инициализируются так же, как объекты членов. Рассмотрим следующий пример:

// spec1_initializing_base_classes.cpp
// Declare class MyClass.
class MyClass
{
public:
   MyClass( int rSize )
   {
   }
};

//  Declare class DialogBox, derived from class MyClass
class DialogBox : public MyClass
{
public:
   DialogBox( int rSize );
};

//  Define the constructor for DialogBox. This constructor
//   explicitly initializes the MyClass subobject.
DialogBox::DialogBox( int rSize ) : MyClass( rSize )
{
}

int main()
{
}

Обратите внимание, что в конструкторе для DialogBox базовый класс MyClass инициализируется с помощью аргумента rSize. Эта инициализация состоит из имени инициализируемого базового класса, после которого следует заключенный в скобки список аргументов для конструктора класса.

При инициализации базовых классов объект, не являющийся подчиненным объектом, представляющим компонент базового класса, считается "полным объектом". Класс полного объекта считается "самым глубоким" производным классом для объекта.

Подчиненные объекты, представляющие виртуальные базовые классы, инициализируются конструктором для самого глубокого производного класса. Это означает, что там, где определено виртуальное наследование, самый глубокий производный класс должен явно инициализировать виртуальный базовый класс, или виртуальный базовый класс должен иметь конструктор по умолчанию. Инициализации виртуальных базовых классов, присутствующие в конструкторах классов, отличных от самого глубокого производного класса, игнорируются.

Хотя инициализация базовых классов обычно ограничена прямыми базовыми классами, конструктор класса может инициализировать косвенный виртуальный базовый класс.

См. также

Ссылки

Инициализация баз и членов