【发布时间】:2013-03-12 04:08:28
【问题描述】:
我正在尝试创建一个抽象类,其他一些类可以作为 arduino 项目的基础。但是,每当我调用基础中的虚拟方法时,它只会调用基础实现。代码如下。谁能看到我做错了什么?
#define RTCBASE 0
class RTC_Base {
public:
virtual uint8_t begin(void){ return 0; };
virtual void adjust(const DateTime& dt){};
virtual DateTime now(){ return DateTime(); };
virtual int Type(){ return RTCBASE; };
};
////////////////////////////////////////////////////////////////////////////////
// RTC based on the DS1307 chip connected via I2C and the Wire library
#define DS1307 1
class RTC_DS1307 : public RTC_Base
{
public:
virtual int Type(){
return DS1307;
}
uint8_t begin(void);
void adjust(const DateTime& dt);
uint8_t isrunning(void);
DateTime now();
uint8_t readMemory(uint8_t offset, uint8_t* data, uint8_t length);
uint8_t writeMemory(uint8_t offset, uint8_t* data, uint8_t length);
};
///In Code
RTC_Base RTC = RTC_DS1307();
DateTime dt = RTC.now();
//The above call just returns a blank DateTime();
【问题讨论】:
-
也许您正在体验对象切片。
-
您是 1) 在派生类中定义函数 2) 不是切片,对吗?此外,一个类不是抽象的,除非它至少有一个纯虚成员函数,而你的则没有。
-
您必须展示您的使用示例。类实例是怎么创建的,怎么变成基类的,又是怎么调用函数的?
-
抱歉...添加了示例。什么是切片?也许抽象是错误的术语......我很难让编译器对纯虚拟很酷,所以我把它们去掉了。
-
部分地,当我尝试使用纯虚拟时,它不会让我这样做:RTC_Base RTC;我想这样做,以便我可以决定在运行时使用哪个派生类。
标签: c++ inheritance arduino abstract-class