无法使用 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 库有时会这样做)。
下面是我要实现的纯虚拟接口 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 库有时会这样做)。