Tuyên bố trong lớp cơ sở trông như thế này:
protected:
void chỉ mụcAll();
void cleanAll();
Trong các lớp dẫn xuất, phần sau không được biên dịch:
chỉ mụcAll(); // Được rồi
connect(&_timer, &QTimer::timeout, this, &FileIndex::indexAll); // LỖI
connect(&_timer, SIGNAL(timeout()), this, SLOT(indexAll())); // OK
我想使用 kết nối
Biến thể đầu tiên vì nó thực hiện một số kiểm tra trong thời gian biên dịch. Tại sao lỗi được trả về:
lỗi: 'void Files::FileIndex::indexAll()' được bảo vệ
void FileIndex::indexAll()
^
[…].cpp:246:58: error: trong bối cảnh này
connect(&_timer, &QTimer::timeout, this, &FileIndex::indexAll);
^
Cú pháp kiểu "cũ" hoạt động vì tín hiệu được phát ra qua qt_static_metacall(..)
chạy nó rồi Chỉ mục tệp
thành viên và do đó có quyền truy cập được bảo vệ.
Cú pháp kiểu "mới" hoạt động được, nhưng vì lý do nàyNó sẽ không cho phép bạn trực tiếp lấy địa chỉ của phương thức lớp cha. Tuy nhiên, nó sẽ sử dụng chỉ mụcTất cả()
địa chỉ "được kế thừa", vì vậy chỉ cần thay đổi mã thành:
connect(&_timer, &QTimer::timeout, this, &Derived::indexAll);
Tôi là một lập trình viên xuất sắc, rất giỏi!