我在我的程序中遇到了设计问题,因为我偶尔需要访问所有存储在基类指针向量中的子类的属性和方法。我的代码看起来像这样:
class B1;
class B2;
class Base {
private:
int id, a, b;
public:
virtual int getA() { return a; }
virtual int getB() { return b; }
virtual B1 *getB1() { return NULL; } //seems like a bad idea
virtual B2 *getB2() { return NULL; } //to have these two functions
Base(int newId) { id = newId; }
};
class B1 : public Base {
private:
int x;
public:
int getX() { return x; }
B1 *getB1() { return this; }
};
class B2 : public Base {
private:
int y;
public:
int getY() { return y; }
B2 *getB2() { return this; }
};
class Thing {
private:
std::vector<Base*> bases;
void addBase(Base *base) { bases.push_back(base); }
void doB1Stuff();
void doB2Stuff();
void setAandB(int ID, int newA, int newB); //set a and b of one of the elements in bases vector based upon the id given
};
问题是我是否需要在 Thing 中访问 x 或 y,如下所示:
void Thing::doB1Stuff() {
for(std::vector<Base*>::iterator it = bases.begin(); it != bases.end(); ++it) {
if (it->getB1()) {
//do stuff with b1
}
}
}
上面的代码应该可以工作,但如果这似乎是个坏主意,因为在使用 B1/B2 属性之前很容易忘记检查指针是否为空,如下所示:
void Thing::doB2Stuff() {
for(std::vector<Base*>::iterator it = bases.begin(); it != bases.end(); ++it) {
std::cout << it->getY(); //I believe this will crash the program if a NULL pointer is returned
}
}
因此,我的问题是:什么是访问子类属性的好方法?我正在考虑在 Thing 中为 B1s 和 B2s 设置两个单独的向量,但这似乎也不是一个好主意,因为我需要能够轻松设置 a 和 b。有什么想法吗?