История изменений
Исправление 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.