2016-04-21 2 views
1
class I1 {}; 
class I2 {}; 
class C : public I1, public I2 {}; 
C c; 
I1 *i = static_cast<I1*>(&c); 
C *p = static_cast<C*>(i); 

Я пытаюсь понять, безопасно ли переключение между указателем на объект и указателем интерфейса.Указатель на класс, реализующий несколько интерфейсов

  • Является ли вышеуказанный код неправильным? Существуют ли проблемы с разбиением объектов и почему?

  • static_cast Соответствующий перевод здесь?

  • Являются ли двоичные представления i и p такими же?

ответ

1

Ваш код в порядке. Там нет нарезки, потому что вы бросаете указатели, а не типы классов. Обратите внимание, что бросок даже не нужен здесь:

I1 *i = static_cast<I1*>(&c); 

static_cast является подходящим литым для другого направления:

C *p = static_cast<C*>(i); 

Если интерфейсные классы имеют виртуальные методы (которые они обычно было бы в реальной программе), вы можете также использовать dynamic_cast, если вы не знаете о типе i до выполнения:

if (C *p = dynamic_cast<C*>(i)) { 
    // use p 
} 

тОИ nt dynamic_cast заключается в том, что он использует RTTI, чтобы узнать, действителен ли актер. Если нет, он вернет null. Если вы используете static_cast, а во время выполнения этот тип неправильный, у вас есть неопределенное поведение.

Бинарное значение указателя производного класса, вероятно, будет таким же, как двоичное значение его первого базового класса, но не второго. Но вы не должны заботиться о таких деталях реализации.

Смежные вопросы