Ngược lại với hàm thành viên ảo, tôi cần một giải pháp trong đó một hàm được thực hiện ở mỗi cấp lớp phái sinh có thể được đăng ký để gọi sau đó. Để thực hiện điều này, tôi đã suy nghĩ về việc cung cấp một cơ chế cho các lớp dẫn xuất để đăng ký chức năng của chúng với lớp cơ sở như trong constructor lớp dẫn xuất.Làm thế nào để đăng ký con trỏ hàm thành viên lớp cơ sở với lớp cơ sở
Tôi đang gặp sự cố với đối số con trỏ hàm thành viên. Tôi đã nghĩ rằng Derived có nguồn gốc từ Base, con trỏ this
sẽ được tự động đúc.
Điều này có thể được thực hiện gần với những gì tôi đang cố gắng hay tôi cần sử dụng các chức năng thành viên tĩnh, void *
và static_cast
?
class Base
{
protected:
typedef void (Base::*PrepFn)(int n);
void registerPrepFn(PrepFn fn) {};
}
class Derived : public Base
{
Derived() {
registerPrepFn(&Derived::derivedPrepFn);
};
void derivedPrepFn(int n) {};
}
biên dịch báo lỗi:
error: no matching function for call to 'Derived::registerPrepFn(void (Derived::*)(int))'
note: candidates are: 'void Base::registerPrepFn(void (Base::*)(int))'
Tôi không chắc chắn chính xác những gì bạn muốn làm. Nhưng chắc chắn là không thể theo cách này; một hàm thành viên được định nghĩa trong 'Derived' không thể được trỏ đến bởi một' Base :: * '. Có lẽ nếu bạn giải thích mục tiêu cấp cao nhất, ai đó có thể đề xuất giải pháp tốt hơn. –
FTR, 'void *' và 'static_cast' sẽ không hoạt động, bởi vì một con trỏ tới hàm thành viên không phải là một con trỏ (có, nó được đặt tên khủng khiếp). –
liên quan đến tĩnh đúc, tôi đã suy nghĩ tôi có thể thực hiện các chức năng thành viên tĩnh và rõ ràng vượt qua xung quanh con trỏ này – NoahR