Я хочу узнать больше о кастинге в c ++ в целом. Это выглядит намного сложнее, чем у Java, который имеет проверку типов и JVM.
C ++ проверяет типы. Используя приведение в стиле c, вы явно просите обойти все средства защиты, которые предоставляет вам система типов. Вы не должны использовать c -тиски в стиле C ++, а скорее static_cast
, dynamic_cast
и в редких случаях const_cast
и в еще более редких случаях reinterpret_cast
,
Если вы замените приведение c в стиле
padd = (CAddition*) &d;
на приведение C ++:
padd = static_cast<CAddition*>(&d);
, то компилятор сообщит вам, что вы делаете неправильно:
prog.cc:19:36: error: invalid static_cast from type 'CDummy*' to type 'CAddition*'
padd = static_cast<CAddition*>(&d);
Я не думаю, что это может быть более понятным: CDummy*
- это не CAddition*
, поэтому вы не должны разыгрывать эти типы.
Поскольку вы делаете, ваш код имеет неопределенное поведение . Ни стандарт C ++, ни компиляторы не заботятся о том, чтобы сделать что-либо значимое с кодом, который имеет неопределенное поведение (отсюда и название: просто не определено, что вы получите).
PS В вашем примере вы может обеспечить преобразование:
class CAddition {
int x,y;
public:
CAddition (const CDummy& cd) : x(cd.i),y(cd.j) {}
CAddition (int a, int b) : x(a),y(b) {}
int result() { return x+y;}
};
Используя такой конструктор преобразования , вы можете легко создать CAddition
из CDummy
(вам нужно сделать элементы public
в CDummy
или предоставьте некоторые другие средства доступа к ним для выполнения этой работы.)
PPS Я был немного неаккуратным, когда сказал выше, что приведение C ++ безопаснее. Они все еще делают хороший инструмент, чтобы выстрелить себе в ногу. Необходимость сотворения обычно является запахом кода / дизайна. Не попадайтесь в ловушку глушения предупреждений / ошибок компилятора, помещая приведения в ваш код. Это может быть хорошо в Java, но в C ++ дела обстоят хуже.