Инициализировать родительский класс с пустым конструктором в списке инициализатора?

0

Существуют ли какие-либо опасности при инициализации родительского класса пустой конструктора в списке инициализации ребенка?

Пример:

class Parent
{
  public:
    Parent(){}
    ~Parent(){}
};

class Child : public Parent
{
  public:
    Child(): Parent()
    {}
    ~Child(){}
};

Причина для вопроса: я часто вижу код, в котором класс родительского класса с пустым ctor не инициализируется в списке инициализации дочернего ctor.

  • 3
    Конструктор по умолчанию вызывается неявно, если вы явно не вызываете конструктор в списке инициализации.
Теги:

1 ответ

1
Лучший ответ

Предположим, что у Parent нет конструктора, предоставляемого пользователем, например, если он является агрегатом:

struct Parent
{
    int x;
    int get_value() const { return x; }
};

Теперь существует разница (cf. [dcl.init]/(8.1)), поскольку инициализация инициализации Parent будет нулевой инициализацией элемента x, тогда как инициализация по умолчанию не будет:

struct GoodChild : Parent { GoodChild() : Parent() {} };

struct BadChild : Parent { BadChild() {} };

Следовательно:

int n = GoodChild().get_value(); // OK, n == 0

int m = BadChild().get_value();  // Undefined behaviour
  • 1
    В частности, в соответствии с C ++ 11 база будет инициализироваться по умолчанию, когда инициализатор не задан ( [C++11: 12.6.2/8] ), а инициализация по умолчанию агрегата не делает ничего полезного. Напротив, включение Parent() в инициализатор ctor приведет к инициализации значений его членов ( [C++11: 12.6.2/7] ).
  • 1
    Downvoter, хочешь объяснить свое возражение? Я был бы рад улучшить неясные или отсутствующие моменты (или просто отредактировать это самостоятельно).
Показать ещё 1 комментарий

Ещё вопросы

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