无法使用 const struct timepec 覆盖纯虚函数*

override pure virtual function not possible with const struct timepec*

下面是我要实现的纯虚拟接口 class:

#include <time.h>
class SharedMemoryInterface
{
public:
    virtual ~SharedMemoryInterface() {}
    virtual int sem_timedwait(sem_t* sem, const struct timepsec* abs_timeout) = 0; 
};

下面是实现:

class SharedMemoryImpl : public SharedMemoryInterface
{
public:
    virtual int sem_timedwait(sem_t* sem, const struct timespec* abs_timeout) { return ::sem_timedwait(sem, abs_timeout); }
};

我收到编译器错误:

SharedMemoryImpl.h:25:7: note:   because the following virtual functions are pure within "SharedMemoryImpl":
 class SharedMemoryImpl : public SharedMemoryInterface
SharedMemoryInterface.h:27:17: note:    virtual int SharedMemoryInterface::sem_timedwait(sem_t*, const timepsec*)
     virtual int sem_timedwait(sem_t* sem, const struct timepsec* abs_timeout) = 0;

唯一的区别似乎是 timespec 参数,它删除了结构并且原型不再匹配,为什么要这样做?

您在 SharedMemoryInterface::sem_timedwait 中有错别字:您写的是 timepsec 而不是 timespec

通常这会导致错误,但您使用了 struct 关键字。当编译器看到 struct timepsec 时,它要么找到一个名为 timepsec 的结构(忽略任何具有相同名称的函数),要么在找不到它时前向声明一个新结构。因此,struct 的使用掩盖了拼写错误。当你在SharedMemoryImpl中正确拼写timespec时,它当然指的是不同的类型。所以 SharedMemoryInterface 中的纯虚函数没有被覆盖。

AFAIK,没有编译器警告来捕获这些拼写错误的前向声明。在 C++ 中,我建议简单地避免详尽的类型说明符是一个好习惯,除非你真的需要你的代码在 C 和 C++ 中编译(显然,这里不是这种情况)或者你需要参考 struct/class 与函数同名(显然,这样命名是不好的,但 C 库有时会这样做)。