Создать IBAction и проверить кнопку выбран или не на быстром языке.
@IBAction func favoriteButtonAction(sender: UIButton) {
// Save Data
sender.selected = !sender.selected;
if (sender.selected)
{
NSLog(" Not Selected");
}
else
{
NSLog(" Selected");
}
}
Нужна ли вам эта функциональность или это просто мысленный эксперимент?
Если вам нужно это сделать, обычно говорят, что Метод клонирования
:
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;
}
То, что вы действительно ищете, называется конструктором виртуального копирования , и то, что опубликовал eduffy, является стандартным способом сделать это.
Есть также ] умные способы сделать это с помощью шаблонов . (отказ от ответственности: самореклама)
Выражение
new A(*b1)
уже имеет значение, предположим, что у вас есть соответствующая перегрузка.
Если бы ему было придано другое значение, вам пришлось бы предоставить другой способ получить другое смысл. Это отчасти бессмысленно, учитывая, что уже есть способ получить желаемое:
new B(*b1)
И угадайте, что легче прочитать.
Да. Нет.
Существует несколько способов реализации клонирования (например, более или менее стандартный метод clone (), параметризованные варианты объектных фабрик, с или без настраиваемого внедрения зависимостей) без изменения смысла существующих программ или его преобразования. невозможно создать экземпляры базовых классов, если производный класс известен в рамках единицы компиляции.
Конструкторы и деструкторы достаточно сложны для понимания начинающими как есть. Было бы неразумно придавать им еще больше сложности.
Как указывалось выше, есть несколько способов реализовать это.
Чтобы ответить на ваш вопрос, если 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;
}
Небольшое дополнение к ответу 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 *