Производные вызовы конструктора классов

Если у меня есть базовый класс:

class Base{
...
};

и производный класс

class Derived : public Base{
...
}

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

Base(int newValue);

но я не определяю конструктор по умолчанию (конструктор без параметров):

Base();

(Я признаю, что это только декларация, а не определение)
Я получаю сообщение об ошибке, пока не определю конструктор по умолчанию, который не принимает параметров. Это потому, что конструктор по умолчанию базового класса вызывается производным классом?

5

Решение

Да, по умолчанию вызывается конструктор по умолчанию. Вы можете обойти это, явно вызвав конструктор не по умолчанию:

class Derived : public Base{
Derived() : Base(5) {}
};

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

9

Другие решения

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

1

По умолчанию компилятор предоставляет три значения по умолчанию:

  1. Ctor по умолчанию (без параметров)

  2. Копировать Ctor

  3. Оператор присваивания

В случае, если вы сами задаете параметризованный Ctor или Copy Ctor, компилятор не предоставляет Ctor по умолчанию, поэтому вы должны явно написать Default Ctor.

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

class Base {
public:
Base(int x){}
};

class Derived {
public:
Derived():Base(5){}             //this will call Parameterized Base Ctor
Derived(int x):Base(x){}        //this will call Parameterized Base Ctor
}
1

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

option 1: by explicitly calling a non-default constructor:

class Derived : public Base{
Derived() : Base(5) {}
};

Вариант 2:

in base class constructor set the parameter default value to 0, so it will
act as default as well as paramterized constructor both

for example:

class base
{ public:
base(int m_a =0){}
};

class Derived
{ public:
Derived(){}
};

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

0
По вопросам рекламы [email protected]