Вы не можете вызвать конструктор, кроме как для создания другого другого объекта.
Если вам нужен общий код между конструкторами, вы можете поместить его в отдельный метод и вызвать этот метод.Обратите внимание, что в конструкторе вы можете вызывать методы объекта, но virtual
методы не собираются отправлять производные классы.
Другими словами, если у вас есть
struct Foo
{
virtual void doit() { ... }
Foo() {
doit();
}
};
struct Bar : Foo
{
virtual void doit() { ... }
};
во время конструктораиз Bar
вызванная реализация doit
будет определена в Foo
, потому что во время конструктора базовой части производного объекта объект является только "базовым" объектом.Только в конце конструктора он становится «производным» объектом прямо перед выполнением любого в конечном итоге присутствующего кода в «производном» конструкторе.
Будьте осторожны, чтобы другие объектно-ориентированные языки использовали другиеподход ...
Для объяснения того, что именно происходит в C ++ , см. эту статью .
Если вам нравится вместо юридического описания, это то, что указано в C ++стандарт по 12.7.4:
Функции-члены, включая виртуальные функции (10.3), могут вызываться во время создания или уничтожения (12.6.2).Когда виртуальная функция вызывается прямо или косвенно из конструктора (в том числе из mem-initializer для члена данных) или из деструктора, и объект, к которому применяется вызов, является объектом, находящимся в процессе создания или уничтожения, вызываемая функция являетсяодин определяется в собственном классе конструктора или деструктора или в одной из его баз, но не является функцией, переопределяющей его в классе, производном от класса конструктора или деструктора, или переопределяющим его в одном из других базовых классов наиболее производного объекта (1.8).Если вызов виртуальной функции использует явный доступ к члену класса (5.2.5), а выражение объекта ссылается на объект, находящийся в процессе создания или уничтожения, но его тип не является ни собственным классом конструктора, ни деструктора, ни одной из его баз, результатзвонок не определен.