Я не совсем понимаю, почему для присваивания производный класс не вызывает соответствующий оператор базового класса, если его собственный не существует. Посмотрите на код:Оператор присваивания C++ в производном классе
#include <iostream>
using namespace std;
class A{
protected:
void myWrite(){
cout << " Base " <<endl;
}
public:
double x,y;
A(): x{0},y{0}{};
virtual A & operator=(double g){x=g;y=g;return *this;}
virtual ~A(){};
virtual void doneit(){myWrite();}
};
class B: public A{
protected:
public:
B():A(){};
virtual ~B(){};
virtual void doneit(){myWrite();}
};
int main() {
A jj;
B pp;
pp=0.0;
return 0;
}
Как это код не компилируется. Конечно, если я определяю «operator =» для B, идентичный тому, что для A, все работает, но почему B «operator =» не вызывается по умолчанию, если тот, что в производном классе не определен? Не могли бы вы помочь пролить свет на эту проблему?
Компилятор gcc говорит ../src/tito.cpp:40:4: ошибка: нет жизнеспособного перегруженного '=' pp = 0.0; ~~^~~~ ../src/tito.cpp:28:7: note: функция-кандидат (неявный оператор присваивания копии) не жизнеспособна: неизвестное преобразование из 'double' в 'const B' для 1-го аргумента класс B: общественный A { ^ 1 погрешность сгенерирована.
Не могли бы вы объяснить, почему это не работает?
Да, основное обоснование является 'оператор этого родителя =' не присваивает часть ребенка так неявно с помощью нее можно easilly создавать сломанные объекты. – StenSoft
Спасибо за очень полезный комментарий! – Max