以下是我要实现的Pure Virtual Interface类:
#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参数中,它删除了struct并且原型不再匹配了,为什么会这样做呢?
答案 0 :(得分:4)
您在SharedMemoryInterface::sem_timedwait
中输错了:您写了timepsec
而不是timespec
。
通常这会导致错误,但您使用的是struct
关键字。当编译器看到struct timepsec
时,它会找到一个名为timepsec
的结构(忽略任何具有相同名称的函数),或者如果找不到,则向前声明一个新结构。因此,struct
的使用掩盖了错字。当你在timespec
中正确拼写SharedMemoryImpl
时,当然它指的是另一种类型。因此SharedMemoryInterface
中的纯虚函数不会被覆盖。
AFAIK,没有编译器警告捕获这些拼写错误的前向声明。在C ++中,我建议简单地避免使用详细的类型说明符是一个很好的做法,除非你真的需要你的代码在C和C ++中编译(显然,这不是这里的情况)或者你需要引用一个struct / class与函数同名(显然,用这种方式命名是很糟糕的,但C库有时会这样做)。