2015-10-09 13 views
5

Tôi đọc nguồn qt và tôi đã nhìn thấy một mã như thế này nhiều lần:Explicit operator = cuộc gọi (T :: operator =)

buttonOpt.QStyleOption::operator=(*opt); 

Vì vậy, tôi đoán nó là cái gì đó như buttonOpt = *opt nhưng tại sao họ sử dụng cú pháp này thay vì mặc định và thân thiện với người dùng? Đây có phải là lợi nhuận nhanh hơn hoặc bất kỳ lợi nhuận nào khác không?

Trả lời

8

Điều này là do họ đang gọi rõ ràng số operator= từ lớp cơ sở là buttonOpt, là QStyleOption.

buttonOpt.QStyleOption::operator=(*opt); 

//similar behavior 
class Base 
{ 
public: 
    virtual bool operator<(Base & other) 
    { 
     std::cout << "Base"; 
    } 
}; 

class Derived : public Base 
{ 
public: 
    bool operator<(Base & other) override 
    { 
     std::cout << "Derived"; 
    } 
}; 

int main() 
{ 
    Derived a; 
    Derived b; 
    a < b; //prints "Derived" 
    a.Base::operator <(b); //prints "Base" 
} 
5

Mã bạn hiển thị được gọi một cách rõ ràng sự phân lớp cơ sở, ví dụ: chỉ những phần lớp cơ sở của QStyleOptionButton được giao, nhưng không phải là các biến thành viên của đối tượng.

Nó xuất hiện từ tài liệu, không có operator= được khai báo cho QStyleOptionButton, vì vậy nếu một người gọi nhiệm vụ thông thường trên đối tượng như vậy, trình biên dịch sẽ cố gắng tạo toán tử như vậy, bao gồm việc gán mỗi lớp con cơ sở và mỗi biến thành viên.

Toán tử được tạo như vậy có thể hoặc không thể biên dịch, tùy thuộc vào việc tất cả các thành viên và lớp cơ sở có thể sao chép được hay không. Trong những trường hợp như vậy, việc định nghĩa toán tử theo cách thủ công là bình thường, để thực hiện việc gán đúng, nếu lớp đó có thể sao chép được.

Tuy nhiên, lý do có thể xảy ra để chỉ định lớp cơ sở một cách rõ ràng là thực sự chỉ các phần cơ sở cần được sao chép, trong khi các thành viên khác không được thay đổi, vì vậy đây không phải là "phân bổ thực" ý thức ngữ nghĩa.

+0

Đây là câu trả lời tuyệt vời, mặc dù câu trả lời được chấp nhận là chính xác, câu trả lời này giải thích lý do. –

Các vấn đề liên quan