2012-03-23 2 views
1

Извините, если этот вопрос уже был задан много раз, а просто хотел найти информацию быстрее, задав вопрос сам. Итак, возникает вопрос: обязательно ли иметь конструктор по умолчанию в суперклассе, чтобы иметь возможность наследовать его? Предположим, что каждый конструктор производного класса вызывает явно один из конструкторов суперкласса, предоставляя правильные параметры - будет ли такой код работать? Я могу предоставить фрагмент кода, чтобы уточнить, о чем я говорю, если есть необходимость. Заранее спасибо.C++: Должен иметь встроенный конструктор суперкласса для наследования?

+0

Ответ, конечно, зависит. У вас есть, например, какие-либо данные в вашем «суперклассе»? –

+0

@MrLister, я говорю про самый простой пример, который вы можете себе представить. Пожалуйста, укажите, что вы подразумеваете под «это зависит». – Egor

+0

См. Ответы. Если в родительском классе нет элементов для инициализации, нет необходимости писать какие-либо конструкторы вообще. Компилятор будет неявно создавать конструктор по умолчанию. –

ответ

7

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

No.

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

Пример,

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) вызывает конструктор, который принимает anotherClassint в качестве аргумента.

+2

Что особенно означает, что компилятор не будет автоматически генерировать конструктор по умолчанию для производных классов. Просто говорю'. –

+1

@ MatthieuM. Если вы предоставляете какой-либо конструктор, компилятор не будет автоматически генерировать его. Если базовый класс не имеет конструктора по умолчанию, а компилятор пытается создать конструктор по умолчанию для производного, это будет ошибка. –

+2

@JamesKanze: да, я пытался указать, что если базовый класс не имеет конструктора по умолчанию, вам обязательно нужно предоставить хотя бы один конструктор для производного класса. –

3

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

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

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

2

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

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

2

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

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

+0

Но тогда возможное исключение не является обязательством в отношении языка. Язык не заставляет вас иметь конструктор по умолчанию даже в этом случае. Это больше касается дизайна иерархии классов и выбора программиста. – Nawaz

+0

@Nawaz Язык не заставляет вас иметь конструктор по умолчанию, но он заставляет вас сделать базовый класс известным для самого производного класса, если у вас нет конструктора по умолчанию. В зависимости от архитектуры это может быть нежелательно. –

0

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

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); 
} 
Смежные вопросы