базовые классы с ++ - PullRequest
       4

базовые классы с ++

0 голосов
/ 18 февраля 2012

Допустим, у меня есть телевизионный класс и класс BigTelevision

class television
{
  protected:
       int a; 
  ...
}
class BigTelevision:public television
{
   private:
   int b;
...
}

Я хочу содержать сборник из телевидения и BigTelevision, какие у меня есть варианты. Я знаю, что одним из способов является использование массива, но проблема в том, что если я объявлю массив телевизионного типа для хранения их, дополнительные атрибуты (например, int b) BigTelevision будут потеряны.

Как я могу обойти это?

Ответы [ 2 ]

4 голосов
/ 18 февраля 2012

Вы должны хранить указатели базового класса или умные указатели базового класса или использовать коллекцию указателей, например 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()});

}
0 голосов
/ 18 февраля 2012

Будете ли вы использовать метод, общий для обоих классов? Если это так, сделайте этот метод виртуальным и создайте массив указателей на базовый класс.

...