C ++ Копирование построения Производный класс из базового класса [дубликат]

Исправить исключение NullReferenceException можно с помощью Null-условных операторов в c # 6 и написать меньше кода для обработки нулевых проверок.

Он используется для проверки нуля до выполнения доступа к члену (?. ) или index (? [).

Пример

  var name = p?.Spouse?.FirstName;

эквивалентен:

    if (p != null)
    {
        if (p.Spouse != null)
        {
            name = p.Spouse.FirstName;
        }
    }

В результате имя будет нулевым когда p равно null или когда p.Spouse имеет значение null.

В противном случае имени переменной будет присвоено значение p.Spouse.FirstName.

Для получения дополнительной информации: Операторы с нулевым условием

22
задан 27 March 2012 в 13:24
поделиться

6 ответов

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

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

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

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

20
ответ дан Luchian Grigore 27 August 2018 в 00:08
поделиться

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

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

Есть несколько случаев, когда это невероятно полезно, например, сериализация классов, отличных от 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);
    }
};
1
ответ дан George Davison 27 August 2018 в 00:08
поделиться

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

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

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

4
ответ дан Mankarse 27 August 2018 в 00:08
поделиться

Да, вы можете создать конструктор виртуальной копии, но вы не можете создать виртуальный конструктор.

Причина:

Виртуальный конструктор: - Не возможно, потому что c ++ является языком статического типа и создает конструктор как виртуальный, поэтому компилятор не сможет решить, какой тип объекта он и оставить весь процесс за время выполнения из-за виртуального ключевого слова. Компилятор должен знать тип класса для создания объекта. Другими словами, какой тип объекта должен быть создан, это решение времени компиляции с точки зрения компилятора C ++. Если мы сделаем конструктор виртуальным, компилятор отметит ошибку.

Конструктор виртуальной копии: - Да Возможно, рассмотрите приложение для клип-карты. Плата клипов может содержать объекты разных типов и копировать объекты из существующих объектов, вставлять их на холст приложения. Опять же, какой тип объекта, который нужно скопировать, является решением во время выполнения. Конструктор виртуальной копии заполняет пробел здесь.

0
ответ дан Priyanka Soni 27 August 2018 в 00:08
поделиться

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

0
ответ дан user 27 August 2018 в 00:08
поделиться

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

1
ответ дан zsounder 27 August 2018 в 00:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: