Thắc mắc về câu lệnh trong việc xây dựng toán tử gán cho lớp dẫn xuất C++

Khi thực hiện phép gán của đối tượng nguồn h1 cho đối tượng đích h2 thì toán tử gán của class C sẽ được thực hiện và thực hiện gán các phần tử theo câu lệnh B(*this) = B::operator=(h); được gọi.

Em muốn hỏi mọi người là khi B::operator=(h) thực thi xong thì các phần tử của C kế thừa từ B được gán, tiếp theo nó ép kiểu B(*this) và gán các thuộc tính thuộc lớp B của đối tượng h cho các thuộc tính của C kế thừa từ B nữa hay sao ạ? Em có chạy thử và thấy khi tiến hành gán thì các thuộc tính của C kế thừa từ B vẫn còn trống, mọi người có thể giải thích cách hoạt động của câu lệnh đó giúp em được không ạ?

Ý bạn là thuộc tính nào của C kế thừa từ B?
char* str; của C là kế thừa từ B?

2 Likes

Khi em thực hiện B::operator=(h) thì thuộc tính int b; char* str; của lớp C kế thừa từ B được gán từ đối tượng h qua đối tượng con trỏ this trỏ tới và nó trả về tham chiếu của h. Sau đó nó thực hiện B(*this) = h thì có phải nó lại tiếp tục gán cho các thuộc tính int b; char* str; của lớp C kế thừa từ B đã có giá trị được gán ở bên trên hay không ạ?

Vì sao không phải là B::operator=(h) thôi mà lại B(*this) = B::operator=(h) vậy ạ?

Thật tiếc khi một quyển giáo trình được dùng rộng rãi lại có những đoạn code như vầy.

Tại sao lại phải dùng char* str trong khi có thể sử dụng thẳng std::string str?
Đoạn code gán B(*this) = B::operator=(h); là dư thừa. Đúng ra thì chỉ cần gọi B::operator=(h); là đủ.
PS: đoạn return h; trong copy assignment operator kia lại càng sai. Đúng ra phải là return *this;

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?