Ктор по умолчанию - это тот, который можно вызвать без аргументов. По крайней мере, с этим кодом у вас его нет: ctor по умолчанию также имеет подпись
ClassName::ClassName();
или каждый аргумент должен иметь значение по умолчанию.
Тем не менее, точка зрения Дирка о синтаксисе верна; если вы хотите вызвать родительские классы ctor, вы должны сделать это после этого двоеточия.
@ Ответ dirkgently показывает правильный синтаксис, но давайте немного его расширим. У вас есть два класса
public class Package {
// ...
Package( /* that horrible ctor arg list */){/*...*/}
// ...
}
public class TwoDayPackage : public Package {
// ...
TwoDayPackage(/* another horrible ctor */); // declaration only
// ...
}
и тогда вы придете, чтобы определить его
TwoDayPackage::TwoDayPackage(string sName, string sAddress,
string sState, string sCountry,
int sZIP, string rName,
string rAddress, string rState,
string rCountry, int rZIP,
float weight, float cost, float flat)
{
Package::Package(sName, sAddress, sState, sCountry, sZIP,
rName, rAddress, rState, rCountry, rZIP,
weight, cost);
flatRate = flat;
}
... но это не работает? Зачем? По сути, потому что то, что вы говорите в C ++, не имеет смысла: Package::Package
просто называет ctor суперкласса и ничего с ним не делает. Вы можете создать новый объект класса Package, используя оператор new ,
Package foo = new
Package::Package(sName, sAddress, sState, sCountry, sZIP,
rName, rAddress, rState, rCountry, rZIP,
weight, cost);
но это все еще не то, что вы хотите сделать; то, что вы хотите , - это сказать С ++, чтобы он строил части пакета в TwoDayPackage, используя этот список аргументов. Вам не нужно иметь полное имя, потому что компилятор уже знает, что такое родительский класс.
Вы также можете просто присваивать значения в дочернем ctor, но это неэффективно, поскольку компилятор генерирует код для "нескольких поездок в скважину". Так что в C ++ есть специальный синтаксис, в котором инициализаторы ставятся после двоеточия, как показал Дирк.
Еще одна вещь: так как вы в любом случае просто присваиваете параметр плоскому, вы можете сказать
TwoDayPackage::TwoDayPackage(string sName, string sAddress,
string sState, string sCountry,
int sZIP, string rName,
string rAddress, string rState,
string rCountry, int rZIP,
float weight, float cost, float flat) :
Package(sName, sAddress, sState, sCountry, sZIP,
rName, rAddress, rState, rCountry, rZIP, weight, cost),
flatRate(flat)
{
}
Проверьте этот раздел C ++ FAQ Lite для получения дополнительной информации.