gpt4 book ai didi

c++ - 覆盖未调用的虚拟方法

转载 作者:行者123 更新时间:2023-11-28 03:21:15 26 4
gpt4 key购买 nike

我正在尝试创建一个抽象类,其他一些类可以作为 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();

最佳答案

你有代码:

RTC_Base RTC = RTC_DS1307();
DateTime dt = RTC.now(); //The above call just returns a blank DateTime();

那是 object slicing (正如@chris 最初猜测的那样)。对于 Polymorphism要工作,您必须假装派生类是基类,方法是将指针或引用 视为基类,而实际上它是派生类的地址。 (因为 Derived 实际上包含其中的 Base)。

Derived myDerived;
Base &myBaseRef = myDerived;

myBaseRef.myVirtualFunction();

否则,您正在创建一个 Derived,并试图将字节强制放入一个 Base,并丢失所有 Derived 的字节。这不好! =)

重点是,您实际上不应该 Derived 转换为 Base,而只是像访问 Base 一样访问 Derived。如果将其转换为基数,则它 是一个基数。并且您的基类返回一个空的 DateTime。

要使用动态分配的内存,您可以这样做:

Base *myBase = nullptr; //Or 'NULL' if you aren't using C++11
myBase = new Derived;

myBase->myVirtualFunction(); //Dereference the myBase pointer and call the function.

delete myBase; //Free the memory when you are finished.

如果你使用的是C++11,你可以让std::unique_ptr为您处理对象的生命周期,因此您不必记住调用“删除”:

std::unique_ptr<Base> myBase;

//Later...
myBase = new Derived;
myBase->myVirtualFunction();

//Automatically freed when the myBase smart pointer goes out of scope...

关于c++ - 覆盖未调用的虚拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15353140/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com