void*类型成员调用方法报错,如何通过接口访问泛型对象方法?
问题解决方法
错误的核心原因是你用了void*类型的指针——void*是无类型指针,编译器无法识别它指向的对象具备accessBlock方法,自然不允许直接调用成员函数。既然你明确所有被指向的对象都继承了InterfaceProtocol接口,完全不需要用void*,直接用基类指针就能实现多态调用。
步骤1:修改SACache类的成员变量类型
把void* next改成InterfaceProtocol* next,让编译器识别这是一个实现了InterfaceProtocol接口的对象指针:
class SACache : public InterfaceProtocol{ InterfaceProtocol* next; // 替换void*为基类指针 virtual void accessBlock(unsigned long int address, unsigned long int size, bool read); };
步骤2:修正成员函数的调用方式
因为next现在是指针类型,调用成员方法时需要用->而非.:
void SACache::accessBlock(unsigned long int address, unsigned long int size, bool read){ // 注意:需确保blockAddress、blockSize是已定义的变量,YES是有效的bool值 next->accessBlock(blockAddress, blockSize, YES); }
额外注意事项
- 要保证
next指针指向的对象确实是继承自InterfaceProtocol的实例,否则运行时会出现未定义行为。 - 记得管理好
next指针的内存,比如避免空指针调用、正确释放资源,防止内存泄漏或野指针问题。
内容的提问来源于stack exchange,提问作者Hans Carrizales
相关产品推荐
相关产品推荐

