Подтвердить что ты не робот

Можем ли мы сделать конструктор экземпляра класса виртуальным в С++

Можно ли создать конструктор экземпляра класса virtual в С++? Как использовать?

4b9b3361

Ответ 1

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

С++ 03 - 12.1 Конструкторы

4) Конструктор не должен быть virtual (10.3) или static (9.4). [...]

Если вам нужно что-то вроде этого, вы можете найти здесь idiom виртуального конструктора .

Ответ 2

Нет, вы не можете.

Кроме того, вся концепция не имеет смысла. Виртуальные функции - это функции, которые отправляются на основе значения объекта (динамического типа объекта). Когда вызывается конструктор, объект еще не имеет значения (поскольку он еще не сконструирован). Поэтому виртуальная отправка не может произойти.

Подумайте об этом. Какую семантику имеет такой конструктор?

Ответ 3

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

Ответ 4

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

Но это не значит, что это невозможно сделать с помощью небольшой магии С++.:)

Есть несколько случаев, когда это невероятно полезно, например, Serializing non-POD. В этом примере создается виртуальный конструктор копий, который работает с использованием нового места размещения.

Предупреждение. Это пример, который может помочь некоторым пользователям с определенными проблемами. Не делайте этого в коде общего назначения. Он сработает, если память, выделенная для нового класса, меньше, чем производный класс. Лучший (и единственный) безопасный способ использовать это, если вы управляете своей собственной памятью классов и используете новое место размещения.

class VirtualBase
{
public: 
    VirtualBase() {}
    virtual ~VirtualBase() {}

    VirtualBase(const VirtualBase& copy)
    {
        copy.VirtualPlacementCopyConstructor(this);
    }

    virtual void VirtualPlacementCopyConstructor(void*) const {}
};

class Derived :: public VirtualBase
{
public:
    ...

    Derived(const Derived& copy) : ... don't call baseclass and make an infinite loop
    {
    }

protected:
    void VirtualPlacementCopyConstructor(void* place) const
    {
        new (place) Derived(*this);
    }
};

Ответ 5

Никогда, это невозможно в С++.