Вы не можете вызвать конструктор, кроме как для создания другого другого объекта.
Если вам нужно иметь какой-то общий код между конструкторами, вы можете поместить его в отдельный метод и вызвать этот метод. Обратите внимание, что в конструкторе вы можете вызывать методы объекта, но методы virtual
не будут отправлять производные классы.
Другими словами, если у вас есть
struct Foo
{
virtual void doit() { ... }
Foo() {
doit();
}
};
struct Bar : Foo
{
virtual void doit() { ... }
};
во время конструктора Bar
вызываемая реализация doit
будет той, которая определена в Foo
, потому что во время конструктора базовой части производного объекта объект является только «базовым» объектом. Только в конце конструктора он становится "производным" объектом прямо перед выполнением любого возможного кода в "производном" конструкторе.
Будьте осторожны, чтобы другие объектно-ориентированные языки использовали другой подход...
Чтобы узнать, что именно происходит в C++, см. эту статью.
Если вам нравится вместо этого юридическое описание, это то, что указано в стандарте С++ в 12.7.4:
Функции-члены, включая виртуальные функции (10.3), можно вызывать во время построения или уничтожения (12.6.2). Когда виртуальная функция вызывается прямо или косвенно из конструктора (в том числе из мем-инициализатора для члена данных) или из деструктора, а объект, к которому применяется вызов, является строящимся или уничтожаемым объектом, вызываемая функция является функция, определенная в собственном классе конструктора или деструктора или в одной из его баз, но не функция, переопределяющая ее в классе, производном от класса конструктора или деструктора, или переопределяющая ее в одном из других базовых классов самого производного объекта (1.8 ). Если вызов виртуальной функции использует явный доступ к члену класса (5.2.5), а выражение-объект ссылается на строящийся или уничтожаемый объект, но его тип не является ни собственным классом конструктора, ни деструктора, ни одним из его базовых элементов, результат вызов не определен.
person
6502
schedule
17.05.2011
std::string
вместоchar *
для представления строк в C++. Это делает вещи намного проще. Кроме того, ваш заголовок предлагает что-то о списках инициализации, но вы не используете их в коде, который вы показываете. - person Björn Pollex   schedule 17.05.2011