鉴于此Arduino C ++代码编译时没有错误或警告:
在Classes.h中:
class TopClass {
private:
int topValue;
public:
TopClass(int v) : topValue(v) {};
int getTop();
virtual int getMiddle() = 0;
virtual int getBottom() = 0;
};
class MiddleClass : public TopClass {
private:
int middleValue;
public:
MiddleClass(int v) : middleValue(v), TopClass(v * v) {};
virtual int getMiddle();
};
class BottomClass : public MiddleClass {
private:
int bottomValue;
public:
BottomClass(int v) : bottomValue(v), MiddleClass(v * v) {};
int getBottom();
};
在Classes.cpp中:
int TopClass::getTop() {
return topValue;
}
int MiddleClass::getMiddle() {
return middleValue;
}
int BottomClass::getBottom() {
return bottomValue;
}
主要;
BottomClass bottom1(2);
show(&bottom1);
BottomClass bottom2(3);
show(&bottom2);
void show(BottomClass *b) {
Serial.print("bottom:"); Serial.println(b->getBottom());
Serial.print("middle:"); Serial.println(b->getMiddle());
Serial.print("top:"); Serial.println(b->getTop());
}
以上代码有效,但无法解决我的问题。
假设我添加:
DifferentBottomClass : public MiddleClass {
private:
int bottomValue;
public:
DifferentBottomClass(int v) : bottomValue(v), MiddleClass(v * v) {};
int getBottom();
};
int DifferentBottomClass::getBottom() {
return bottomValue;
}
现在show函数停止工作,因为它基于BottomClass,而不是DifferentBottomClass。
我需要的是能够根据需要在尽可能多的不同版本的BottomClass中滑动,而无需更改任何父代码或show函数。
如果我添加:
TopClass *top;
top->getTop();
top->getMiddle();
top->getBottom();
所有编译,但因为* top指向任何地方,代码会爆炸。
如何初始化* top以便找到每个子类的当前实例化版本?
答案 0 :(得分:0)
你的课程应该是:
class TopClass {
public:
int topValue = 1;
int getTop();
virtual int getMiddle() = 0;
virtual int getBottom() = 0;
};
class MiddleClass : public TopClass
{
public:
int middleValue = 2;
virtual int getMiddle();
};
class BottomClass : public MiddleClass
{
public:
int bottomValue = 3;
int getBottom();
};
int TopClass::getTop() {
return topValue;
}
int MiddleClass::getMiddle() {
return middleValue;
}
int BottomClass::getBottom() {
return bottomValue;
}
问题是当你调用getTop(),getMiddle()和getBottom()时,你有一个递归调用。如果它是桌面应用程序,它可能会在崩溃之前给你一个堆栈溢出异常。