用const struct timepec *覆盖不可能的纯虚函数

时间:2016-02-13 01:59:16

标签: c++ inheritance virtual pure-virtual

以下是我要实现的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并且原型不再匹配了,为什么会这样做呢?

1 个答案:

答案 0 :(得分:4)

您在SharedMemoryInterface::sem_timedwait中输错了:您写了timepsec而不是timespec

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

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