В C++ есть понятие списка инициализации конструктора, который является, где вы можете и должны назвать конструктор базового класса, и вы должны также инициализировать элементы данных. Список инициализации появляется после подписи конструктора после двоеточия и перед телом конструктора. Скажем, у нас есть класс А:
class A : public B
{
public:
A(int a, int b, int c);
private:
int b_, c_;
};
Тогда, предполагая, что B имеет конструктор, который принимает Int, конструктор может выглядеть следующим образом:
A::A(int a, int b, int c)
: B(a), b_(b), c_(c) // initialization list
{
// do something
}
Как вы можете видеть, конструктор базовый класс вызывается в списке инициализации. Инициализация членов данных в списке инициализации, кстати, предпочтительнее назначать значения для b_ и c_ внутри тела конструктора, поскольку вы сохраняете дополнительную стоимость назначения.
Имейте в виду, что члены данных всегда инициализируются в том порядке, в котором они объявлены в определении класса, независимо от их порядка в списке инициализации. Чтобы избежать странных ошибок, которые могут возникнуть, если ваши члены данных зависят друг от друга, вы всегда должны следить за тем, чтобы порядок членов был одинаковым в списке инициализации и определении класса. По той же причине конструктор базового класса должен быть первым элементом в списке инициализации. Если вы вообще опустите его, то конструктор по умолчанию для базового класса будет вызываться автоматически. В этом случае, если базовый класс не имеет конструктора по умолчанию, вы получите ошибку компилятора.
я удалил 'явный' из конструктора суперкласса. Несмотря на то, что они были лучшей практикой для конструкторов с одним аргументом, это не было связано с обсуждением. Дополнительные сведения о явном ключевом слове см. По адресу: http://weblogs.asp.net/kennykerr/archive/2004/08/31/Explicit-Constructors.aspx – luke 2008-09-24 12:38:48
Оператор двоеточия: вы использовали для вызова конструктора суперкласса перед созданием экземпляра дочернего элемента конструктор класса, я полагаю, это также верно для методов? – ha9u63ar 2014-10-31 09:33:57
@hagubear, только для конструкторов, AFAIK – luke 2014-10-31 12:24:26