Я нахожу поведение C ++ очень раздражающим. Вы не можете написать виртуальные функции, например, чтобы вернуть желаемый размер объекта, и чтобы конструктор по умолчанию инициализировал каждый элемент. Например, было бы неплохо сделать:
BaseClass() {
for (int i=0; i<virtualSize(); i++)
initialize_stuff_for_index(i);
}
С другой стороны, преимущество поведения C ++ состоит в том, что оно препятствует написанию конструкторов, подобных приведенным выше.
Я не думаю, что проблема вызова методов, предполагающих, что конструктор завершен, является хорошим оправданием для C ++. Если бы это действительно было проблемой, то конструктору не разрешили бы вызывать любые методы, поскольку та же самая проблема может применяться к методам для базового класса.
Еще одно замечание по отношению к C ++ состоит в том, что поведение намного менее эффективно. Хотя конструктор точно знает, что он вызывает, указатель vtab нужно менять для каждого отдельного класса от базового до конечного, поскольку конструктор может вызывать другие методы, которые будут вызывать виртуальные функции. Исходя из моего опыта, это тратит гораздо больше времени, чем экономится, делая вызовы виртуальных функций в конструкторе более эффективными.
Гораздо более раздражающим является то, что это также относится к деструкторам. Если вы пишете виртуальную функцию cleanup (), а деструктор базового класса выполняет cleanup (), она, безусловно, не выполняет то, что вы ожидаете.
Это и тот факт, что C ++ вызывает деструкторы для статических объектов при выходе, действительно долго меня бесили.