Конструктор не может быть виртуальным - PullRequest
5 голосов
/ 14 декабря 2011

В одном из учебников по C ++ в Интернете я обнаружил приведенное ниже описание, почему конструктор не может быть виртуальным

Мы не можем объявить виртуальный конструктор. Мы должны указать точное тип объекта во время компиляции, чтобы компилятор мог выделить память для этого конкретного типа.

Это описание верно?

Меня смущает, в частности, фраза: so that the compiler can allocate memory for that specific type.

Ответы [ 5 ]

19 голосов
/ 14 декабря 2011

Как объясняет сам Бьярне здесь

Виртуальный вызов - это механизм для выполнения работы с частичной информацией. В частности, «виртуальный» позволяет нам вызывать функцию, зная только интерфейсы, а не точный тип объекта. Для создания объекта вам нужна полная информация. В частности, вам нужно знать точный тип того, что вы хотите создать. Следовательно, «вызов конструктора» не может быть виртуальным.

3 голосов
/ 14 декабря 2011

Конструктор не может быть виртуальным, потому что стандарт так говорит.

Стандарт говорит так, потому что это не имеет смысла. Что будет делать виртуальный конструктор?

В полиморфизме используются виртуальные методы ... как должен работать полиморфизм, если у вас еще нет объектов?

Мы должны указать точный тип объекта во время компиляции, поэтому что компилятор может выделить память для этого конкретного типа.

Мы должны указать точный тип во время компиляции, потому что мы хотим, чтобы объект этого типа ... Я нашел их описание очень запутанным.

Кроме того, в параграфе не говорится, что это причина, по которой конструкторы не могут быть виртуальными. Это объясняет, почему виртуальные методы не должны вызываться из конструктора, но это все.

1 голос
/ 14 декабря 2011

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

... он работаетпроблема создания объектов (продуктов) без указания точного класса объекта, который будет создан

1 голос
/ 14 декабря 2011

Как конструктор сможет быть virtual? virtual означает, что результат вызова этой функции определяется динамическим типом объекта. До строительства нет объекта для этого.

То, как фразы в уроках, что такое конструктор, также является фальшивым. Вам нужно , чтобы указать точный тип, иначе объявленная вами вещь не будет считаться конструктором, а функции без возвращаемого типа не допускаются.

1 голос
/ 14 декабря 2011

Это правильно, хотя в моем скромном мнении оно не соответствует действительности.

Конструкторы устанавливают виртуальную диспетчеризацию, то есть указывают правильные указатели на функции текущего класса. Если бы конструкторы могли быть виртуальными, кто бы заранее создал виртуальный конструктор? Там будет ужасная проблема курицы и яйца.

Однако существует идиома «виртуальный конструктор», в которой статический член класса возвращает указатель базового класса с подходящим классом:

class A {
    static A* create();
    virtual ~A();
};

class B : public A { ... };

A* A::create() { return new B(); }
...