C ++: Обязательный по умолчанию конструктор суперкласса для наследования? - PullRequest
1 голос
/ 23 марта 2012

Обязательно ли иметь конструктор по умолчанию в суперклассе, чтобы иметь возможность наследовать от него?Предположим, что каждый конструктор производного класса явно вызывает один из конструкторов суперкласса, предоставляя правильные параметры - будет ли работать такой код?

Ответы [ 5 ]

7 голосов
/ 23 марта 2012

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

номер

Если у вас нет конструктора по умолчанию в базовом классе, вам нужно вызвать конструктор базового класса с аргументом (аргументами) явно из списка инициализации члена производного класса.

Пример,

class base
{
   public:
     base(std::string const & s, int n);
};

class derived : public base
{
   anotherClass obj;
   public:
     derived() : base("string", 10), obj(100) 
     {       //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ member-initialization list
     }
};

Обратите внимание на синтаксис base("string", 10). Он вызывает конструктор базового класса, передавая "string" в качестве первого аргумента и 10 в качестве второго аргумента.

Также обратите внимание на obj(100), который инициализирует переменную-член типа anotherClass: obj(10) вызывает конструктор anotherClass, который принимает int в качестве аргумента.

3 голосов
/ 23 марта 2012

При условии, что

  • Конструктор по умолчанию не вызывается явно
  • Все подклассы вызывают при построении определяемый пользователем конструктор суперкласса с параметрами

не обязательно писать конструктор по умолчанию.

2 голосов
/ 23 марта 2012

Нет, с одним возможным исключением.Обычно конструктор базового класса вызывается производным классом непосредственно над ним, используя аргументы, предоставленные этим производным классом (если есть).Если все непосредственные производные классы инициализируют базовый класс явным образом, тогда конструктор по умолчанию не требуется.

Единственное возможное исключение - если вы наследуетесь практически от базового класса.В этом случае это не непосредственный производный класс, который инициализирует базовый класс, а самый производный класс.И в зависимости от того, как организована ваша иерархия классов, вы можете не захотеть, чтобы самый производный класс знал о базе;для самого производного класса должно быть достаточно знать только о тех классах, от которых он напрямую наследует.(Конечно, это идеал, и это не всегда так.) К счастью, как это бывает, почти каждый раз, когда это происходит, база представляет собой абстрактный класс без данных (и, следовательно, с конструктором по умолчанию).Но об этом нужно помнить.

2 голосов
/ 23 марта 2012

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

Если у вас есть класс без конструктора по умолчанию, каждый вынужден использовать явный конструктор при создании экземпляра, верно? Это та же самая концепция: если все дочерние элементы гарантируют, что конструктор по умолчанию никогда не вызывается, тогда нет необходимости его реализовывать.

0 голосов
/ 23 марта 2012

Нет, вам не нужен конструктор по умолчанию. Следующие компиляции и запуска, с или без частного конструктора по умолчанию.

class A {
public:

  A(int i) {
    m = i;
  }

private:

  A() { } // This line can be commented out. Included only to make point

  int m;
};

class B : A {
public:

  B(int i) 
    : A(i) 
    {
    }

};

int main() {
  B b(10);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...