2016-02-23 1 views
2
#include <iostream> 
using namespace std; 

struct Left 
{ 
    char i = 'k'; 
}; 

struct Right 
{ 
    int a = 99; 
}; 

class Bottom : public Left, public Right 
{}; 

int main() 
{ 
    Bottom b; 

    Left l = b; 
    cout << l.i; 

    Right r = b; 
    cout << r.a; 

    return 0;  
} 
// output 
// k99 

Как это работает?расположение памяти в множественном наследовании

если расположение память Дно:

Left 
Right 
Bottom 

Тогда нарезка b (т.е. Bottom) для Left объекта, должно быть в порядке, но как она может работать, когда я нарежьте Bottom к Right объекта?

Примечание: все это было бы нормально, если бы я использовал литье. Но я не сделал этого.

+1

Вы отрезали часть 'Right', в чем проблема? Другими словами, вы называете 'Right :: Right (Right const &)' как 'b' как аргумент, и эта функция может читать' ba' и назначать 'this-> a' –

+0

Когда я делаю' Right r = b', я получаю объект 'Right' из объекта' Bottom', без кастинга. так как компилятор выяснил правильное смещение? – Kam

+0

Компилятор решает, какой будет макет памяти для «Bottom», он знает, где части находятся точно так же, как он знает, где какая-либо конкретная переменная-член –

ответ

1

Bottom до Right или до Left является надлежащим преобразованием, а не только срезанием. Компилятор генерирует код с использованием правильного смещения под-объекта в Bottom.

Этот Dr.Dobbs article должен быть вам интерес.

+0

Так зачем использовать static_cast <> когда-нибудь? Если компилятор может понять, что я не разрезаю, а конвертирую, какая точка для литья – Kam

+1

@Kam для некоторых преобразований требуется оператор трансляции, если они считаются «опасными» (и/или по историческим причинам), чтобы уменьшить риск случайного возникновения неопределенного поведения. Например, преобразование базы в производную требует отливки, потому что база не может быть фактически базой определенного производного. Но для производной базы не требуется листинг, потому что все производные имеют эту базу. Это не связано с информацией –

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

  • Нет связанных вопросов^_^