C++: Полиморфные Конструкторы Копии могли работать?

Создать IBAction и проверить кнопку выбран или не на быстром языке.

@IBAction func favoriteButtonAction(sender: UIButton) {

    // Save Data
    sender.selected  = !sender.selected;

    if (sender.selected)
    {
        NSLog(" Not Selected");
    }
    else
    {
        NSLog(" Selected");
    }

}
6
задан Ahmed Said 20 June 2009 в 13:47
поделиться

6 ответов

Нужна ли вам эта функциональность или это просто мысленный эксперимент?

Если вам нужно это сделать, обычно говорят, что Метод клонирования :

class A
{
public:
    A( int val ) : m_ValA( val ) {}
    A( const A& rhs ) {}
    virtual A *Clone () = 0;
    int m_ValA;
};

class B : public A
{
public:
    B( int val4A, int val4B ) : A( val4A ), m_ValB( val4B ) {}
    B( const B& rhs ) : A( rhs ), m_ValB( rhs.m_ValB ) {}
    A *Clone() { return new B(*this); }
    int m_ValB;
};

int main()
{
    A* b1 = new B( 1, 2 );
    A* b2 = b1->Clone();
    return 0;
}
20
ответ дан 8 December 2019 в 03:54
поделиться

То, что вы действительно ищете, называется конструктором виртуального копирования , и то, что опубликовал eduffy, является стандартным способом сделать это.

Есть также ] умные способы сделать это с помощью шаблонов . (отказ от ответственности: самореклама)

4
ответ дан 8 December 2019 в 03:54
поделиться

Выражение

new A(*b1)

уже имеет значение, предположим, что у вас есть соответствующая перегрузка.

Если бы ему было придано другое значение, вам пришлось бы предоставить другой способ получить другое смысл. Это отчасти бессмысленно, учитывая, что уже есть способ получить желаемое:

new B(*b1)

И угадайте, что легче прочитать.

1
ответ дан 8 December 2019 в 03:54
поделиться

Да. Нет.

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

Конструкторы и деструкторы достаточно сложны для понимания начинающими как есть. Было бы неразумно придавать им еще больше сложности.

0
ответ дан 8 December 2019 в 03:54
поделиться

Как указывалось выше, есть несколько способов реализовать это.

Чтобы ответить на ваш вопрос, если new A (* b1) вернет новый экземпляр B, то это не сработает.

int main()
{
    A* b1 = new B( 1, 2 );
    A a( *b1 ); // What size would 'a' be if it was polymorphicly constructed?
    return 0;
}
0
ответ дан 8 December 2019 в 03:54
поделиться

Небольшое дополнение к ответу eduffy: Вместо

class B : public A {
  ...
  A *Clone() { return new B(*this); } 
  ...

};

вы можете объявить это так:

class B : public A {
  ...
  B *Clone() { return new B(*this); } // note: returning B *
  ...

};

Это все еще считается действительным переопределением виртуального A::Clone(); и лучше, если оно будет вызвано непосредственно через B *

2
ответ дан 8 December 2019 в 03:54
поделиться
Другие вопросы по тегам:

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