我在程序中遇到了設計問題,因爲我需要偶爾訪問所有存儲在基類指針向量中的子類的屬性&。我的代碼看起來是這樣的:訪問C++子類的屬性/功能
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
};
的問題是,如果我需要訪問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中的B1和B2使用兩個單獨的向量,但這似乎並不是一個好主意,因爲我需要能夠輕鬆設置a和b。有什麼想法嗎?
如果您的類在上下文中表現出根本性不同,則不應將它們混合在數組中。也許你想使用模板呢? – Dave
您的確切問題已通過'dynamic_cast'解決。 (或更好的設計) –