В заголовочном файле определите базовый класс:
class BaseClass {
public:
BaseClass(params);
};
Затем определите производный класс как наследующий BaseClass:
class DerivedClass : public BaseClass {
public:
DerivedClass(params);
};
В исходном файле определите конструктор BaseClass:
BaseClass::BaseClass(params)
{
//Perform BaseClass initialization
}
По умолчанию производный конструктор вызывает только базовый конструктор по умолчанию без параметров; поэтому в этом примере конструктор базового класса НЕ вызывается автоматически при вызове производного конструктора, но этого можно достичь, просто добавив синтаксис конструктора базового класса после двоеточия (:
). Определите производный конструктор, который автоматически вызывает его базовый конструктор:
DerivedClass::DerivedClass(params) : BaseClass(params)
{
//This occurs AFTER BaseClass(params) is called first and can
//perform additional initialization for the derived class
}
Конструктор BaseClass
называется ДО конструктора DerivedClass
, и те же самые / другие параметры params
могут быть перенаправлены в базовый класс при желании. Это может быть вложено для более глубоких производных классов. Производный конструктор должен вызывать ТОЛЬКО ОДИН базовый конструктор. Деструкторы автоматически вызываются в обратном порядке, что и конструкторы.
РЕДАКТИРОВАТЬ: есть исключение из этого правила, если вы наследуете от любых virtual
классов, обычно для достижения множественного наследования или наследования алмазов . Затем вы ДОЛЖНЫ явно вызывать базовые конструкторы всех virtual
базовых классов и явно передавать параметры, в противном случае он будет вызывать только их конструкторы по умолчанию без каких-либо параметров. См .: виртуальное наследование - пропуск конструкторов