class SuperClass
{
public:
SuperClass(int foo)
{
// do something with foo
}
};
class SubClass : public SuperClass
{
public:
SubClass(int foo, int bar)
: SuperClass(foo)
{
// do something with bar
}
};
Подкласс наследует конструктор суперкласса? Что его наследует и почему мне нужно указать в конструкторе sub-класса : SuperClass(foo)
?
Конструкторы не наследуются, но их нужно вызвать.
Если ваш базовый класс имеет конструктор по умолчанию, тогда производный класс автоматически вызовет это для вас, если вы не укажете альтернативу. Причина, по которой вы должны указать вызов конструктору базового класса, состоит в том, что этот класс указывает, что он должен быть инициализирован целым числом, а в качестве производного класса ваша ответственность - гарантировать правильность инициализации базового класса.
Нет SubClass
не наследует конструктор. Например, вы не можете просто вызвать одного из конструкторов SuperClass
как вы могли, с функциями, которые наследуются.
Но SubClass
- это SuperClass
определенный вашим наследованием. Поэтому, чтобы быть SuperClass
он должен не только создавать себя, но и создавать SuperClass
.
Это делается с использованием конструктора. И поскольку вы не определяете конструктор по умолчанию (один без аргументов), компилятор не может знать, какой конструктор нужно вызвать. Именно по этой причине вам необходимо явно написать, какой конструктор должен использовать SubClass
для создания SuperClass
.
Нет, подкласс не "наследует" конструктор базового класса. Синтаксис действительно схож, но его значение сильно отличается. Происходит то, что конструктор подкласса инициализирует свою внутреннюю копию объекта суперкласса прежде всего. Причина, по которой вы должны указать это вручную, заключается в том, что базовый класс может иметь разные конструкторы, которые вы можете вызвать с помощью определенных argumens для определенного конструктора подкласса.
Конструктор не наследуется, вам нужно использовать: SuperClass (foo), потому что вы пытаетесь передать аргумент в конструктор базового класса. Даже если вы не укажете компилятор, убедитесь, что конструктор по умолчанию базового класса (конструктор нулевых аргументов) вызывается когда когда-либо созданных объектами класса. Но в вашем случае вы не определили конструктор нулевых аргументов. Обязательно определите его перед удалением ': SuperClass (foo)' !!!
Подкласс наследует конструктор суперкласса?
Да
Что его наследует и почему мне нужно указать в конструкторе sub-класса: SuperClass (foo)?
потому что ваш SuperClass не предоставляет конструктор по умолчанию (с аргументами), а компилятор не знает, как построить объект SuperClass, вы должны сказать ему, что foo
является foo
foo
в конструкторе SuperClass. Если у вас был конструктор по умолчанию (и никаких других ) тогда для компилятора было бы очевидно использовать его и как вызывать