假设我有一个电视课和BigTelevision课
class television
{
protected:
int a;
...
}
class BigTelevision:public television
{
private:
int b;
...
}
我想包含一个混合的电视和BigTelevision的集合,我有什么选择。 我知道一种方法是使用数组,但问题是,如果我声明一个电视类型数组来存储它们,那么BigTelevision的附加属性(例如int b)就会丢失。
我该如何解决这个问题?
答案 0 :(得分:4)
你必须存储基类指针或基类智能指针,使用像boost:ptr_vector这样的指针集合。
std::vector<television*> tv;
tv.push_back(new television);
tv.push_back(new BigTelevision);
// don't forget to delete
// better:
std::vector<std::unique_ptr<television>> tv;
tv.push_back(std::unique_ptr<television>(new television));
tv.push_back(std::unique_ptr<television>(new BigTelevision));
现在可以通过公共接口(多态)使用不同的对象。
class television
{
public:
// The interface for all television objects.
// Each television can calculate its price.
virtual int Price() const { return price_; }
private:
int price_;
};
class BigTelevision
{
public:
virtual int Price() const { return television::Price() * discount_; }
private:
double discount_;
};
int main()
{
std::vector<std::unique_ptr<television>> shoppingCard;
// add a basic television and a BigTelevision to my shopping card
shoppingCard.push_back(std::unique_ptr<television>(new television));
shoppingCard.push_back(std::unique_ptr<television>(new BigTelevision));
// whats the price for alle the tvs?
int price = 0;
for(auto tv = begin(shoppingCard), last = end(shoppingCard);
tv != last; ++tv)
price += (*tv)->Price();
// or:
int price = std::accumulate(begin(shoppingCard), end(shoppingCard), 0,
[](int sum, const std::unique_ptr<television>& tv)
{ return sum + tv->Price()});
}
答案 1 :(得分:0)
您会使用两个类共有的方法吗?如果是这样,请将该方法设置为virtual,并创建一个指向基类的指针数组。