Почему мой C++ разделяет на подклассы, нуждаются в явном конструкторе?

У меня есть базовый класс, который объявляет и определяет конструктора, но по некоторым причинам мой публично производный класс не видит, что конструктор, и я поэтому должен явно объявить передающего конструктора в производном классе:

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).

11
задан Neil Steiner 10 July 2010 в 01:30
поделиться

3 ответа

Все производные классы должны вызывать конструктор своего базового класса в той или иной форме.

Когда вы создаете перегруженный конструктор, ваш сгенерированный компилятором по умолчанию конструктор без параметров исчезает, и производные классы должны вызывать перегруженный конструктор.

Когда у вас есть что-то вроде этого:

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 для вызова конструктора базового класса, вы должны явно сделать это сами.

6
ответ дан 3 December 2019 в 05:11
поделиться

Конструкторы не наследуются. Вам необходимо создать конструктор для производного класса. Более того, конструктор производного класса должен вызывать конструктор базового класса.

15
ответ дан 3 December 2019 в 05:11
поделиться

Вы должны сконструировать базовый класс, прежде чем работать с производным. Если вы создаете свой производный класс с нетривиальными конструкторами, компилятор не может решить, что вызывать для базы, поэтому возникает ошибка.

1
ответ дан 3 December 2019 в 05:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: