B=D;
D=B;
Первая строка всегда будет компилироваться. Вторая строка может компилироваться или не компилироваться, так как она полностью зависит от того, как вы написали каждый класс. Остальная часть ответа прояснит это. Продолжайте читать.
так ли, что D = B; будет действительным, только если B имеет конструктор по умолчанию?
номер
D=B
будет действительным, только если D определил operator=
, который принимает B
в качестве аргумента.
Derived & operator=(const Base &base); //member of Derived
Base B;
Derived D;
D = B; //allowed - assignment
Или, если вы сделаете это при инициализации D
, он будет действителен, только если конструктор D
примет B
в качестве аргумента.
Derived(const Base &base); //a constructor of Derived
Base B;
Derived D = B; //allowed - initialization
Или B
определил пользовательское преобразование в D
.
operator Derived(); //member of Base
Base B;
Derived D = B; //allowed - initialization
D = B; //also allowed - assignment