Конструктор наследования C ++ из базового класса

0
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)?

Теги:
oop
inheritance

5 ответов

2

Конструкторы не наследуются, но их нужно вызвать.

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

2

Нет SubClass не наследует конструктор. Например, вы не можете просто вызвать одного из конструкторов SuperClass как вы могли, с функциями, которые наследуются.

Но SubClass - это SuperClass определенный вашим наследованием. Поэтому, чтобы быть SuperClass он должен не только создавать себя, но и создавать SuperClass.
Это делается с использованием конструктора. И поскольку вы не определяете конструктор по умолчанию (один без аргументов), компилятор не может знать, какой конструктор нужно вызвать. Именно по этой причине вам необходимо явно написать, какой конструктор должен использовать SubClass для создания SuperClass.

0

Нет, подкласс не "наследует" конструктор базового класса. Синтаксис действительно схож, но его значение сильно отличается. Происходит то, что конструктор подкласса инициализирует свою внутреннюю копию объекта суперкласса прежде всего. Причина, по которой вы должны указать это вручную, заключается в том, что базовый класс может иметь разные конструкторы, которые вы можете вызвать с помощью определенных argumens для определенного конструктора подкласса.

0

Конструктор не наследуется, вам нужно использовать: SuperClass (foo), потому что вы пытаетесь передать аргумент в конструктор базового класса. Даже если вы не укажете компилятор, убедитесь, что конструктор по умолчанию базового класса (конструктор нулевых аргументов) вызывается когда когда-либо созданных объектами класса. Но в вашем случае вы не определили конструктор нулевых аргументов. Обязательно определите его перед удалением ': SuperClass (foo)' !!!

-1

Подкласс наследует конструктор суперкласса?

Да

Что его наследует и почему мне нужно указать в конструкторе sub-класса: SuperClass (foo)?

потому что ваш SuperClass не предоставляет конструктор по умолчанию (с аргументами), а компилятор не знает, как построить объект SuperClass, вы должны сказать ему, что foo является foo

  • 0
    можешь объяснить свой последний ответ? что вы подразумеваете под компилятором не будет знать?
  • 0
    Проще говоря, у вас есть конструктор в SuperClass, который принимает один аргумент, и при создании объекта SubClass вы должны вызывать его, но не очевидно, какое значение следует передать параметру foo в конструкторе SuperClass. Если у вас был конструктор по умолчанию (и никаких других ) тогда для компилятора было бы очевидно использовать его и как вызывать

Ещё вопросы

Сообщество Overcoder
Наверх
Меню