LINUX.ORG.RU

История изменений

Исправление igorbounov, (текущая версия) :

Поскольку забыл уже С++, а вспоминать надо - жизнь того требует, попробовал разобраться с этим примером, восстанавливая полустертые записи в нейронах мозга. Я написал простенькую программку:

class Parent{

private:

int i;

public:

Parent& operator = (Parent &p){

this->i = p.i;

return *this;

}

};

class Child: public Parent{

};

int main (void)

{

Parent p;

Child c;

(Parent)c = p;

return 0;

};

Сохранил ее в файлике test.cpp и компилировал командой gcc test.cpp -o test Ее тоже пришлось вспоминать из затянувшихся пылью чердаков мозга.

Так вот, сначала пришлось дополнить описание оператора: return *this; потому что этот оператор по его определению возвращает объект определенного типа. А затем мне еще пришлось вгрубую сделать кастинг: (Parent)c = p; Как он правильно делается, я забыл, но в данном случае подошло. Все потому, что оператор «operator =» связан с конкретным типом Parent, и он ничего не значет про тип Child. Пусть даже структуры этих классов идентичны, формально - это разные типы переменных для комплитора (переменные, или экземпляры p и c). Поэтому - кастинг.

Возможно, если в определении оператора «operator=» использовать шаблон типа (это что-то, использующее <…>, но это я еще хуже помню), то тогда оно сработает и для экземпляра класса Child.

Исправление igorbounov, :

Поскольку забыл уже С++, а вспоминать надо - жизнь того требует, попробовал разобраться с этим примером, восстанавливая полустертые записи в нейронах мозга. Я написал простенькую программку:

class Parent{

private: int i; public: Parent& operator = (Parent &p){ this->i = p.i; return *this; } };

class Child: public Parent{

};

int main (void)

{ Parent p; Child c; (Parent)c = p;

return 0;

};

Сохранил ее в файлике test.cpp и компилировал командой gcc test.cpp -o test Ее тоже пришлось вспоминать из затянувшихся пылью чердаков мозга.

Так вот, сначала пришлось дополнить описание оператора: return *this; потому что этот оператор по его определению возвращает объект определенного типа. А затем мне еще пришлось вгрубую сделать кастинг: (Parent)c = p; Как он правильно делается, я забыл, но в данном случае подошло. Все потому, что оператор «operator =» связан с конкретным типом Parent, и он ничего не значет про тип Child. Пусть даже структуры этих классов идентичны, формально - это разные типы переменных для комплитора (переменные, или экземпляры p и c). Поэтому - кастинг.

Возможно, если в определении оператора «operator=» использовать шаблон типа (это что-то, использующее <…>, но это я еще хуже помню), то тогда оно сработает и для экземпляра класса Child.

Исходная версия igorbounov, :

Поскольку забыл уже С++, а вспоминать надо - жизнь того требует, попробовал разобраться с этим примером, восстанавливая полустертые записи в нейронах мозга. Я написал простенькую программку: class Parent{ private: int i; public: Parent& operator = (Parent &p){ this->i = p.i; return *this; } };

class Child: public Parent{

};

int main (void) { Parent p; Child c; (Parent)c = p;

return 0;

};

Сохранил ее в файлике test.cpp и компилировал командой gcc test.cpp -o test Ее тоже пришлось вспоминать из затянувшихся пылью чердаков мозга.

Так вот, сначала пришлось дополнить описание оператора: return *this; потому что этот оператор по его определению возвращает объект определенного типа. А затем мне еще пришлось вгрубую сделать кастинг: (Parent)c = p; Как он правильно делается, я забыл, но в данном случае подошло. Все потому, что оператор «operator =» связан с конкретным типом Parent, и он ничего не значет про тип Child. Пусть даже структуры этих классов идентичны, формально - это разные типы переменных для комплитора (переменные, или экземпляры p и c). Поэтому - кастинг.

Возможно, если в определении оператора «operator=» использовать шаблон типа (это что-то, использующее <…>, но это я еще хуже помню), то тогда оно сработает и для экземпляра класса Child.