引用子类的属性

时间:2016-06-16 06:09:33

标签: arduino abstract-class

鉴于此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以便找到每个子类的当前实例化版本?

1 个答案:

答案 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()时,你有一个递归调用。如果它是桌面应用程序,它可能会在崩溃之前给你一个堆栈溢出异常。