У меня есть базовый класс, который объявляет и определяет конструктора, но по некоторым причинам мой публично производный класс не видит, что конструктор, и я поэтому должен явно объявить передающего конструктора в производном классе:
class WireCount0 {
protected:
int m;
public:
WireCount0(const int& rhs) { m = rhs; }
};
class WireCount1 : public WireCount0 {};
class WireCount2 : public WireCount0 {
public:
WireCount2(const int& rhs) : WireCount0(rhs) {}
};
int dummy(int argc, char* argv[]) {
WireCount0 wireCount0(100);
WireCount1 wireCount1(100);
WireCount2 wireCount2(100);
return 0;
}
В вышеупомянутом коде, моем WireCount1 wireCount1(100)
объявление отклоняется компилятором ("Никакая функция соответствия для вызова к 'WireCount1:: WireCount1 (интервал)'"), в то время как мой wireCount0
и wireCount2
объявления прекрасны.
Я не уверен, что понимаю, почему я должен предоставить явного конструктора, показанного в WireCount2
. Это, потому что компилятор генерирует конструктора по умолчанию для WireCount1
, и тот конструктор скрывается WireCount0
конструктор?
Для ссылки компилятор i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5659)
.
Все производные классы должны вызывать конструктор своего базового класса в той или иной форме.
Когда вы создаете перегруженный конструктор, ваш сгенерированный компилятором по умолчанию конструктор без параметров исчезает, и производные классы должны вызывать перегруженный конструктор.
Когда у вас есть что-то вроде этого:
class Class0 {
}
class Class1 : public Class0 {
}
Компилятор фактически генерирует это:
class Class0 {
public:
Class0(){}
}
class Class1 : public Class0 {
Class1() : Class0(){}
}
Когда у вас есть конструктор не по умолчанию, конструктор без параметров больше не генерируется. Когда вы определяете следующее:
class Class0 {
public:
Class0(int param){}
}
class Class1 : public Class0 {
}
Компилятор больше не генерирует конструктор в Class1 для вызова конструктора базового класса, вы должны явно сделать это сами.
Конструкторы не наследуются. Вам необходимо создать конструктор для производного класса. Более того, конструктор производного класса должен вызывать конструктор базового класса.
Вы должны сконструировать базовый класс, прежде чем работать с производным. Если вы создаете свой производный класс с нетривиальными конструкторами, компилятор не может решить, что вызывать для базы, поэтому возникает ошибка.